静态链接和部署

我正在尝试部署(向公众发布)我最近开发的一个简单的 qt 应用程序,但是在静态链接 qt 库方面遇到了困难。

我按照 qt 文档上的指南静态地重新构建 qt 和我的应用程序。但是发布版本仍然需要 qtgui/qtcore dll,没有明显的原因,我想知道是否有人以前见过这种问题?或者更好的是,已经成功地解决了这个问题?

Http://doc.qtsoftware.com/4.5/deployment-windows.html

102414 次浏览

我写了 静态连接指南

如何使用多个编译器构建静态 Qt 并使其保持较小

(因为它可以变得非常大,特别是对于简单的程序)。 您可能还想检查一下 BitRock 安装程序,它对于开源项目是免费的。

简而言之,如果您正在使用 Qt 认为是插件的任何东西,比如对大多数图像类型(JPEG、 GIF)或数据库的支持,那么结果会稍微复杂一些。 例如,如果希望为图标包含对 Oracle DBMS 和 GIF 图像的支持,可以将以下内容添加到。专业档案:

QTPLUGIN += qsqloci qgif
CONFIG += static

然后,你需要:

#include <QtPlugin>

在您的项目中,并导入所使用的任何插件。您需要重新修改这些设置,以便再次使用动态链接进行编译(如在调试或添加特性时) ,尽管这可以很容易地实现自动化。在构建静态链接使用的 Qt 库时,还有一些注意事项,不过 Qt 指令至少可以帮助您开始。

另外,请注意您的静态构建仍然会动态链接到可视化工作室运行时!

这个常见问题(互联网档案馆链接以防链接消失) :

为什么静态生成的 Qt 使用动态 VisualStudio 运行时库?我需要在应用程序中部署它们吗?

Qt 是使用-MD (d)开关构建的,该开关链接到动态 C/C + + 运行时库。这是必要的,因为我们在使用除 -MD (d)标志之外的任何标志时都遇到过内存问题,通常建议使用。您不应该为您的应用程序自己更改这个标志,因为如果您将标志更改为 -MT,它将与构建 Qt 库的方式冲突。您也不应该为 Qt 更改它,因为它可能会导致问题。

当使用-static 选项时,Qt 仍然是静态构建的,这意味着在部署应用程序时不需要分发 Qt dls。不过,您必须分发 C 运行时(如果目标机器上还没有运行时) ,请参阅我们的部署文档 http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies

有了 Qt 5.5,事情就变得相当简单了。这是构建 Qt 之前必须运行的 configure脚本。传递给 configure的正交设置如下:

  1. 您想要一个静态 Qt 库吗?

-static选项应传递给 configure

  1. 您希望 Qt 和您的应用程序的构建使用静态 C + + 运行时吗?

-static-runtime选项应传递给 configure

  1. 你想要 XP 的目标吗?

-target xp选项应传递给 configure

另外,按照 这篇博文的说明操作。

Qt Creator 至少在3.5.0版本之前不支持 XP 自动定位,因为它没有正确地为构建工具设置环境。您必须手动修改构建环境 根据博客文章

我刚刚静态地编译了一个应用程序(调试) 与 QT 插件(5.9) , 与 VS (2015)(双赢)。

A)加入你的代码。

#include <QtPlugin>
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

B)在链接路径中添加以下内容

\5.9.0_x86_static_install\lib
\5.9.0_x86_static_install\bin
\5.9.0_x86_static_install\plugins
\5.9.0_x86_static_install\plugins\platforms
\5.9.0_x86_static_install\plugins\imageformats

C)将 QT 静态库和内部 VS 库的列表添加到您的链接列表中。

version.lib
imm32.lib
shlwapi.lib
rpcrt4.lib
Ws2_32.lib
Mpr.lib
Netapi32.lib
Rpcrt4.lib
Iphlpapi.lib
winmm.lib
gdi32.lib
advapi32.lib
msimg32.lib
UxTheme.lib
translatord.lib
preprocessord.lib
d3d9.lib
dxguid.lib
libEGLd.lib
libGLESv2d.lib
iphlpapi.lib
psapi.lib
ws2_32.lib
Dwmapi.lib
Qt5CoreD.lib
Qt5Guid.lib
Qt5Xmld.lib
Qt5Widgetsd.lib
Qt5Networkd.lib
Qt5Winextrasd.lib
Qt5PlatformCompositorSupportd.lib
qicod.lib
qtmaind.lib
qtlibpngd.lib
qtharfbuzzd.lib
qtpcre2d.lib
qwindowsd.lib
Qt5FontDatabaseSupportd.lib
Qt5ThemeSupportd.lib
Qt5EventDispatcherSupportd.lib
Qt5AccessibilitySupportd.lib
qtfreetyped.lib

Kevin Higgins

Msys2 有一个预先构建的 < a href = “ https://github.com/Alexpux/MINGW-package/tree/master/mingw-w64-Qt5-static”rel = “ nofollow norefrer”> static Qt5包

例如 pacman -S mingw-w64-qt5-static

目前,要获得 Qt 的所有依赖项静态链接,使用 CMake,您需要添加:
list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
在打电话给 find_package(Qt5之前。


CMAKE_AUTOSTATICPLUGINS被一个新的上游实现所取代,不再需要了。

我建议您使用 Linuxloyqt这个工具。它可以帮助解决大多数依赖性问题。我使用它成功地打包了我的 qt 应用程序。

这个答案适用于在 Windows 和 qmake 中使用 MSYS2Mingw-w64作为编译器。


安装包 qt5-static将为您提供一个 QT 构建,该构建产生不依赖任何 QT DLL 的可执行文件。(示例命令行 -pacman -Ss mingw64/mingw-w64-x86_64-qt5-static)。

但是这里引入了一个新问题: 它没有将 -static标志传递给 gcc。这意味着尽管可执行文件不依赖于 QT DLL,但它确实依赖于 libgcc-s、 libwinpthread.dll 等。

通常,这个问题可以通过使用 CONFIG += static来解决,这会导致 qmake 将 -static传递给 gcc。但是,正如在其他答案中指出的,对于 qt 静态构建,该配置选项将被忽略!

为了解决这个问题,我必须手动为 qmake 文件中的静态链接指定 gcc 标志,即:

QMAKE_CXXFLAGS += -static
QMAKE_LFLAGS_WINDOWS += -static

其结果是一个(大型)二进制文件,除了 Windows 系统 DLL 之外没有其他外部依赖项。

(如果有必要的话: 我的用例是构建一个 COM 进程内服务器 DLL,它应该没有外部依赖项; 我还使用了 TEMPLATE=libCONFIG += dll)。