我最近制作了一个简单的qt应用程序,现在想要将其部署(发布到公众)。但是我遇到了静态链接qt库的问题。
我按照qt文档上的指南重新构建了qt和我的应用程序,使它们可以静态链接。但是发布版本仍然需要qtgui / qtcore dll文件,原因不明,我想知道是否有人遇到过这种问题?或者更好的是,已经成功解决了这个问题?
我最近制作了一个简单的qt应用程序,现在想要将其部署(发布到公众)。但是我遇到了静态链接qt库的问题。
我按照qt文档上的指南重新构建了qt和我的应用程序,使它们可以静态链接。但是发布版本仍然需要qtgui / qtcore dll文件,原因不明,我想知道是否有人遇到过这种问题?或者更好的是,已经成功解决了这个问题?
我写了如何进行静态链接的指南
以及如何使用多种编译器构建小型静态Qt库(因为针对简单程序,Qt库会变得非常大)。 你也可以查看BitRock安装程序,该程序对于开源项目是免费的。
简而言之,如果您正在使用Qt认为是插件的任何内容,例如大多数图像类型(JPEG、GIF)或数据库支持,则情况会变得更加复杂。 例如,如果您想要包含对Oracle DBMS和GIF图像的支持,您需要将以下内容添加到您的 .PRO 文件中:
QTPLUGIN += qsqloci qgif
CONFIG += static
您需要完成以下步骤:
#include <QtPlugin>
在你的项目中,导入任何使用过的插件。为了使它能够再次通过动态链接编译(例如调试或添加功能时),你需要将这些设置更改回来,尽管这可以很容易地自动化。当构建用于静态链接的Qt库时也需要考虑一些因素,但Qt的指令至少会让你有所启发。
qmake
?因为这里是关于CMake的。你可以在全局设置中简单地设置它:set(CMAKE_AUTOSTATICPLUGINS ON)
或者作为一个目标特定属性进行设置:set_target_properties(${PROJECT_NAME} PROPERTIES AUTOSTATICPLUGINS ON)
。 - Darklighter我是一名有用的助手,可以为您进行文本翻译。
我刚刚使用QT插件(5.9)和VS(2015)(Win)进行了应用程序的静态编译(Debug)。
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
我建议您使用linuxdeployqt这个工具。它可以帮助解决大部分依赖问题。我使用它成功地打包了我的Qt应用程序。
qt5-static
会为您提供一个QT的构建版本,生成的可执行文件不依赖于任何QT DLLs。(示例命令行- pacman -Ss mingw64/mingw-w64-x86_64-qt5-static
)-static
标志传递给gcc。这意味着虽然可执行文件不依赖于QT DLLs,但它确实依赖于libgcc-s、libwinpthread.dll等。CONFIG += static
来解决这个问题,这会导致qmake将-static
传递给gcc。然而,正如其他答案中所指出的那样,对于qt-static构建,该配置选项被忽略了!QMAKE_CXXFLAGS += -static
QMAKE_LFLAGS_WINDOWS += -static
CONFIG += static
即可解决问题。如果没有Qt的静态副本,请下载源代码并进行编译。编译静态库需要几个小时的时间。 - Md. Minhazul Haque