如何使Qt和Qt Creator静态链接库而不是动态链接?

22

我知道这可能是一个与许多其他问题类似的问题,但在搜索多次并未找到明确有效的解决方案后,我不得不问这个问题。

我正在使用 Qt 5.2.0 for Windows 32-bit (VS 2010, 570 MB),我已经编写好了程序。但现在我想将它分发为 .exe 文件,为了避免复杂性和不必分发 dll 文件,我需要使用静态链接构建程序。

请问如何使 Qt 5.2.0 for Windows 32-bit (VS 2010, 570 MB) 使用静态链接构建整个程序?

谢谢。


你是否有Qt的静态版本? - UmNyobe
1
什么是Qt的静态版本?我只安装了**Qt 5.2.0 for Windows 32-bit (VS 2010, 570 MB)**,我没有检查过它是否是静态的。 - the_naive
@UmNyobe:是的,如果打包Qt库也是必要的话,那么原帖作者必须拥有它。在这种情况下,他将需要自己构建Qt。 - László Papp
1
只要您的应用程序是使用QT商业许可证或在LGPL下开发的,就可以静态构建Qt。否则,您需要进行动态链接。 - ManuelH
1
@the_naive:我相应地更新了我的答案。 - László Papp
显示剩余4条评论
1个回答

27

您可以使用qmake的CONFIG变量来实现这一点:

CONFIG += static
CONFIG += staticlib

然而,您需要确保您希望捆绑的所有库都可用作静态库。

这包括Qt框架本身,如果您遵守许可证要求。官方安装只设置动态库(.dll文件),因此您需要自己构建Qt来完成此操作。

您可以使用以下命令为自己的目的构建Qt静态库:

configure -developer-build -opensource -nomake examples -nomake tests -static
qmake -r
nmake

请注意,在构建类似于您的第三方Qt软件时,最好使用以下参数调用qmake以正确传递您的环境:

qmake -r -spec win32-msvc2010 
请注意,正如Frank和ManuelH在评论中写的那样,如果您的应用程序不是自由许可证或至少与LGPL兼容,也不使用Qt商业许可证,则不允许静态链接。在选择方法之前最好确定一下这个问题。
完成后,您可以像平常一样使用LIBS变量,例如:将您的静态库路径与库名称一起传递给它,就像这样:
LIBS += -L/path/to/the/static/library -lstaticlibraryname

请注意,传递给-l参数的静态库名称不应包含静态库扩展名,例如在Windows上的.lib

作为一种备选方案,您始终可以静态链接其他库,并将Qt dll文件放置在可执行文件旁边,并将文件夹部署为“软件包”。这可能是您采取的更简单的方式。


3
它什么也没有做。Exe文件大小仍然很小,仍然无法在另一台计算机上启动。我已经下载了适用于MinGW的Qt 5.7版本。它包含带有<name>.dll的bin目录和带有lib<name>.a的lib目录,因此静态库显然存在。然而,staticstaticlib都不起作用。 - Youda008
2
一旦使用了Qt的静态构建,正如您所正确指出的那样,那么在项目配置本身中添加任何特殊内容都没有意义。它将被静态链接到Qt,并且如果Qt配置为-static-runtime,可能还会静态链接到语言运行时。所选择的Qt构建的参数决定了使用该特定Qt构建构建的项目的情况。不需要CONFIG += static,这是一个无操作。 - Kuba hasn't forgotten Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接