我正在尝试部署(发布给公众)我最近制作的一个简单的qt应用程序,但被卡在静态链接qt库中。
我按照有关qt docs的指南静态地重建了qt和我的应用程序。但是发行版本仍然没有明显的原因需要qtgui / qtcore dll,我想知道是否有人以前见过这种问题?甚至更好,已经成功解决了吗?
我正在尝试部署(发布给公众)我最近制作的一个简单的qt应用程序,但被卡在静态链接qt库中。
我按照有关qt docs的指南静态地重建了qt和我的应用程序。但是发行版本仍然没有明显的原因需要qtgui / qtcore dll,我想知道是否有人以前见过这种问题?甚至更好,已经成功解决了吗?
Answers:
(因为它可能会变得很大,尤其是对于简单程序而言)。您可能还需要检查BitRock安装程序,该程序对于开源项目是免费的。
简而言之,如果您将Qt认为是插件的任何东西使用,例如对大多数图像类型(JPEG,GIF)或数据库的支持,则要复杂一些。例如,如果要包括对图标的Oracle DBMS和GIF图像的支持,请将以下内容添加到.PRO文件中:
QTPLUGIN += qsqloci qgif
CONFIG += static
然后,您需要:
#include <QtPlugin>
在您的项目中,并导入所有使用的插件。您需要更改这些设置,以便使其能够再次通过动态链接进行编译(例如在调试或添加功能时),尽管这可以轻松实现自动化。构建Qt库以用于静态链接时,还需要考虑一些因素,尽管Qt指令至少可以帮助您入门。
另外,请注意,您的静态构建仍将动态链接到Visual Studio运行时!
为什么静态构建的Qt使用动态Visual Studio运行时库?我是否需要在应用程序中部署它们?
Qt使用-MD(d)开关构建,该开关链接到动态C / C ++运行时库。这是必要的,因为在使用-MD(d)标志之外的任何东西时我们都会遇到内存问题,通常建议使用。您不应该自己为应用程序更改此标志,因为如果将标志更改为-MT,则它与Qt库的构建方式冲突。您也不应为Qt更改它,因为它可能会引起问题。
但是,当使用-static选项时,Qt仍是静态构建的,这意味着在部署应用程序时无需分发Qt dll。不过,您将不得不分发C运行时(如果目标计算机上尚不存在),请参阅我们的部署文档http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies。
qmake
在此处输入错误,因为这是关于CMake的。您可以将其设置为全局:set(CMAKE_AUTOSTATICPLUGINS ON)
或作为目标特定属性:set_target_properties(${PROJECT_NAME} PROPERTIES AUTOSTATICPLUGINS ON)
。
我只是使用QT插件(5.9)和VS(2015)(Win)静态地编译了一个应用程序(调试)。
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
凯文·希金斯
此答案适用于在Windows和qmake中将MSYS2与mingw-w64一起用作编译器。QT版本是5.15.0。
安装该软件包可以qt5-static
使您构建一个QT,该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-static构建,该配置选项将被忽略!
为了解决这个问题,我必须手动为qmake文件中的静态链接指定gcc标志,即:
QMAKE_CXXFLAGS += -static
QMAKE_LFLAGS_WINDOWS += -static
这将导致(大)二进制文件,除了Windows系统DLL之外,没有任何外部依赖性。
(以防万一:我的用例是构建不应该具有外部依赖关系的COM进程内服务器DLL;我也使用TEMPLATE=lib
和CONFIG += dll
)。
CONFIG += static
解决此问题。如果您没有Qt的静态副本,请获取源代码并进行构建。获取静态库需要几个小时。