与 Qt 项目的静态链接

Posted

技术标签:

【中文标题】与 Qt 项目的静态链接【英文标题】:Static linking with a Qt project 【发布时间】:2011-04-17 08:32:27 【问题描述】:

我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目。但是,当我运行它(在调试或发布模式下)时,它会要求一些 Qt dll。如果我提供 dll 并将它们放入 System32 中,它会起作用,但我的问题是,我如何才能使所有库都包含在 .exe 中?我有我需要的所有静态库,只是不知道如何制作,这样应用就不会向最终用户询问它们。

【问题讨论】:

【参考方案1】:

正确的方法是创建一个安装程序,将 Qt 库与您的应用程序一起安装。 Visual Studio 附带一个安装项目模板,您可以使用该模板轻松创建自己的自定义安装程序。出于多种原因,静态链接很少是一个好的选择。

但是,如果您坚持使用静态链接,则需要使用 -static 标志重新编译 Qt 源代码。here 提供了 Qt 4 的演练。

如果您使用的是 Qt 的 LGPL 版本,请确保您已阅读 this question 的答案并适当地解决了与您的部署有关的所有法律问题。

【讨论】:

我确实想知道,我将如何配置东西以便只有少数库将静态链接,而其余的(将来可能需要更新/修复的库)将动态链接? @user:我很确定这是不可能的。你要么得到所有的 Qt 库,要么没有。您可以静态链接 Qt 库,但不能 Microsoft 的 C/C++ 运行时库(反之亦然)。但我不确定你为什么想要。如果您的目标是消除所有依赖项并发布单个 EXE,那么静态链接是您唯一的选择。如果您愿意拥有 一些 依赖项,那么您真的应该构建一个安装程序并将 that 作为您的单个 EXE。这对用户来说是一个额外的步骤,但它确实减少了头痛! 有点离题,但我想知道为什么静态链接不是一个好的选择?我在 Google 上找不到太多关于这方面的信息,我想知道这样我才能说服我的客户忘记静态链接(这对于 Qt 来说总是一场噩梦)。 @Laurent:嗯,我能想到几个缺点,但非常很少(如果有的话)能说服客户。理想情况下,这种关系足够好,他们相信您作为开发人员的判断,并接受您的建议。除此之外,我可以想到两种不同的选择。首先是用静态链接阻止他们在为运行时库发布时获得安全更新的论点来吓唬他们。当应用程序被静态链接时,您必须发布一个全新的版本,并将其部署到所有客户端计算机,以便利用任何... 可能已对最新版本的库进行了安全改进。而新版本的运行时库要小得多,可以独立部署,并且通常由 Windows Update 推送(当然,Qt 不是这种情况)。第二条路线(这是我最喜欢的)向他们展示了创建安装程序是多么容易。 Inno Setup 是我个人最喜欢的解决方案,但 VS 也有这个内置的。您可以创建一个相当于单个 EXE 的安装程序,就像部署单个 EXE 应用程序一样容易。用户所要做的就是点击安装。

以上是关于与 Qt 项目的静态链接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用静态链接构建 Qt 应用程序

Qt系列文章之三十七(基于QWidget 创建和使用静态链接库)

Qt系列文章之三十七(基于QWidget 创建和使用静态链接库)

QT静态库静态编译

在 qt 4.5 中,是不是可以在静态链接插件中拥有资源?

Qt 共享库(动态链接库)和静态链接库的创建及调用