我正在尝试部署(向公众发布)我最近开发的一个简单的 qt 应用程序,但是在静态链接 qt 库方面遇到了困难。
我按照 qt 文档上的指南静态地重新构建 qt 和我的应用程序。但是发布版本仍然需要 qtgui/qtcore dll,没有明显的原因,我想知道是否有人以前见过这种问题?或者更好的是,已经成功地解决了这个问题?
Http://doc.qtsoftware.com/4.5/deployment-windows.html
我写了 静态连接指南
如何使用多个编译器构建静态 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 使用动态 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的正交设置如下:
configure
-static选项应传递给 configure
-static
-static-runtime选项应传递给 configure
-static-runtime
-target xp选项应传递给 configure
-target xp
另外,按照 这篇博文的说明操作。
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
pacman -S mingw-w64-qt5-static
目前,要获得 Qt 的所有依赖项静态链接,使用 CMake,您需要添加: list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib) 在打电话给 find_package(Qt5之前。
list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
find_package(Qt5
CMAKE_AUTOSTATICPLUGINS被一个新的上游实现所取代,不再需要了。
CMAKE_AUTOSTATICPLUGINS
我建议您使用 Linuxloyqt这个工具。它可以帮助解决大多数依赖性问题。我使用它成功地打包了我的 qt 应用程序。
这个答案适用于在 Windows 和 qmake 中使用 MSYS2和 Mingw-w64作为编译器。
安装包 qt5-static将为您提供一个 QT 构建,该构建产生不依赖任何 QT DLL 的可执行文件。(示例命令行 -pacman -Ss mingw64/mingw-w64-x86_64-qt5-static)。
qt5-static
pacman -Ss mingw64/mingw-w64-x86_64-qt5-static
但是这里引入了一个新问题: 它没有将 -static标志传递给 gcc。这意味着尽管可执行文件不依赖于 QT DLL,但它确实依赖于 libgcc-s、 libwinpthread.dll 等。
通常,这个问题可以通过使用 CONFIG += static来解决,这会导致 qmake 将 -static传递给 gcc。但是,正如在其他答案中指出的,对于 qt 静态构建,该配置选项将被忽略!
CONFIG += static
为了解决这个问题,我必须手动为 qmake 文件中的静态链接指定 gcc 标志,即:
QMAKE_CXXFLAGS += -static QMAKE_LFLAGS_WINDOWS += -static
其结果是一个(大型)二进制文件,除了 Windows 系统 DLL 之外没有其他外部依赖项。
(如果有必要的话: 我的用例是构建一个 COM 进程内服务器 DLL,它应该没有外部依赖项; 我还使用了 TEMPLATE=lib和 CONFIG += dll)。
TEMPLATE=lib
CONFIG += dll