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

the*_*ive 18 c++ qt qt-creator

我知道这可能是一个类似于其他许多问题的问题,但经过多次搜索并且未能获得明确有效的解决方案后,我不得不提出这个问题.

我正在使用Qt 5.2.0 for Windows 32位(VS 2010,570 MB),我已经完成了我的编程,而且一切都完成了.但是现在我想将它作为.exe文件分发给我的同事,但是这样做没有复杂性并且为了避免分发dll文件我需要使用静态链接来构建程序.

您能否描述一下我如何使用静态链接构建整个程序的Qt 5.2.0 for Windows 32-bit(VS 2010,570 MB)

谢谢.

lpa*_*app 22

您可以使用CONFIGqmake 的变量:

CONFIG += static
Run Code Online (Sandbox Code Playgroud)

要么

CONFIG += staticlib
Run Code Online (Sandbox Code Playgroud)

但是,您需要确保拥有要捆绑的所有库,可以作为静态库使用.

如果您遵守许可证,这也包括Qt框架本身.官方安装只设置动态库(.dll文件),因此您需要自己构建Qt才能实现此目的.

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

configure -developer-build -opensource -nomake examples -nomake tests -static
qmake -r
nmake
Run Code Online (Sandbox Code Playgroud)

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

qmake -r -spec win32-msvc2010 
Run Code Online (Sandbox Code Playgroud)

还请注意,正如Frank和ManuelH在评论中写道的那样,如果您的应用程序不是LGPL或至少与LGPL兼容的免费许可,则不允许静态链接,也不使用Qt的商业许可.在采取您的方法之前,最好确保这一点.

完成后,您可以LIBS以常规方式使用该变量,如下所示:将静态库的路径与库名称一起传递给它,如下所示:

LIBS += -L/path/to/the/static/library -lstaticlibraryname
Run Code Online (Sandbox Code Playgroud)

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

作为后备,您可以始终静态链接其他库,并将Qt dll文件放在可执行文件旁边,然后将该文件夹部署为"包".这可能是你走的更容易的方式.

  • 它什么都不做.Exe仍然很小,仍然无法在另一台计算机上启动.我已经为MinGW下载了Qt 5.7.它包含带有<name> .dll的目录bin和带有lib <name> .a的目录lib,因此静态库很明显.然而,"静态"和"静态"都不起作用. (2认同)
  • 一旦使用Qt的静态构建,正如您正确指出需要的那样,那么向项目配置本身添加任何特殊内容都没有意义.如果Qt配置了`-static-runtime`,它将静态链接到Qt,并且可能还静态链接到语言运行库.所选Qt构建的参数决定了使用特定Qt构建构建的项目会发生什么.不需要`CONFIG + = static`,这是一个无操作. (2认同)