【问题标题】:How to make Qt and Qtcreator link the libraries statically instead of dynamic? [duplicate]如何使 Qt 和 Qtcreator 静态链接库而不是动态链接? [复制]
【发布时间】:2013-12-27 10:37:17
【问题描述】:

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

我正在使用 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的静态版本吗?
  • 静态版Qt是什么意思?我只安装了 Qt 5.2.0 for Windows 32-bit (VS 2010, 570 MB),我没有检查它是否是静态的。
  • @UmNyobe:是的,如果还需要捆绑 qt 库,则 OP 必须具备这一点。在这种情况下,他将需要自己构建 Qt。
  • 只要您的应用程序是使用 QT 商业许可证开发的或在 LGPL 下开发的,就可以静态构建 Qt。否则,您将需要动态链接。
  • @the_naive:我分别更新了我的答案。

标签: c++ qt qt-creator


【解决方案1】:

您可以在 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 或至少与 LGPL 兼容,或者您​​没有使用 Qt 的商业许可,则不允许静态链接。最好在采用您的方法之前确定这一点。

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

LIBS += -L/path/to/the/static/library -lstaticlibraryname

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

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

【讨论】:

  • 它什么都不做。 Exe 仍然很小,仍然无法在另一台计算机上启动。我已经为 MinGW 下载了 Qt 5.7。它包含带有 .dll 的目录 bin 和带有 lib.a 的目录 lib,因此静态库显然在那里。然而,staticstaticlib 都不起作用。
  • 一旦使用 Qt 的静态构建,正如您正确声明的那样,向项目配置本身添加任何特殊的东西就没有意义了。它将静态链接到 Qt,如果 Qt 配置了-static-runtime,也可能静态链接到语言运行时。所选 Qt 构建的参数决定了您使用该特定 Qt 构建构建的项目会发生什么。不需要CONFIG += static,这是一个空操作。
猜你喜欢
  • 2020-01-13
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多