我正在尝试部署(向公众发布)我最近制作的一个简单的qt应用程序,但却陷入静态链接qt库。
我按照qt docs上的指南来静态重建qt和我的应用程序。但是发布版本仍然需要qtgui / qtcore dll没有明显的原因,我想知道以前有没有人见过这种问题?或者甚至更好,已经成功解决了它?
答案 0 :(得分:42)
和 How to build Qt static with multiple compilers and keep it small
(因为它可以变得非常大,特别是对于简单的程序)。 您可能还想查看BitRock安装程序,它对于开源项目是免费的。
简而言之,如果你使用任何Qt认为是插件的东西,例如支持大多数图像类型(JPEG,GIF)或数据库,它会变得更复杂一些。 例如,如果要包含对图标的Oracle DBMS和GIF图像的支持,请将以下内容添加到.PRO文件中:
QTPLUGIN += qsqloci qgif
CONFIG += static
然后你需要:
#include <QtPlugin>
在您的项目中,并导入所使用的任何插件。您需要按顺序更改这些设置以使其再次使用动态链接进行编译(例如在调试或添加功能时),尽管这可以轻松实现自动化。在构建用于静态链接的Qt库时也需要考虑,尽管Qt指令至少可以帮助您入门。
答案 1 :(得分:16)
使用Qt 5.5,事情很简单。在构建Qt时,您可以将以下正交设置传递给configure
:
您想要一个静态Qt库吗?
-static
选项应传递给configure
您是否希望Qt和应用程序的构建使用静态C ++运行时?
-static-runtime
选项应传递给configure
您想要XP定位吗?
-target xp
选项应传递给configure
此外,请按照this blog post。
中的说明操作Qt Creator至少在v.3.5.0之前不支持XP自动定位,因为它没有正确设置构建工具的环境。您必须手动修改构建环境per the blog post。
答案 2 :(得分:6)
另外,请注意,静态构建仍将动态链接到visual studio运行时!
请参阅this faq(internet archive link, in case the link goes away):
为什么静态构建的Qt使用动态Visual Studio运行时库?我是否需要使用我的应用程序部署它们?
使用-MD(d)开关构建Qt,该开关链接动态C / C ++运行时库。这是必要的,因为我们在使用除-MD(d)标志之外的任何东西时都遇到了内存问题,并且通常建议使用。您不应该自己为您的应用程序更改此标志,因为如果您将标志更改为-MT,它将与Qt库的构建方式发生冲突。您也不应该为Qt更改它,因为它可能会导致问题。
在使用-static选项时,Qt仍然是静态构建的,这意味着在部署应用程序时不需要分发Qt dll。您必须分发C运行时(如果目标计算机上尚不存在它们),请参阅我们的部署文档http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies。
答案 3 :(得分:3)
我只是静态编译了一个应用程序(Debug) 使用QT插件(5.9), 与VS(2015)(Win)。
a)添加到您的代码中。
\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
b)将以下内容添加到链接路径
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
c)将QT静态库和内部VS库列表添加到链接列表中。
{{1}}
Kevin Higgins
答案 4 :(得分:3)
msys2有一个预先构建的static Qt5 package
...使用CMake,当设置CMAKE_AUTOSTATICPLUGINS
目标属性时,也链接所有可用的插件。 (目前,这只能通过下游补丁启用,非官方,但达到目标)
如果您使用qmake,至少可以省去您自己构建它的努力。
答案 5 :(得分:0)
我建议您使用 linuxdeployqt 此工具。它可以帮助解决大多数依赖问题。我用它成功打包了我的qt应用程序。
答案 6 :(得分:0)
此答案适用于在Windows和qmake中使用 MSYS2 和 mingw-w64 作为编译器。 QT版本是5.15.0。
安装软件包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-static构建,该配置选项将被忽略!
要解决此问题,我必须手动为qmake文件中的静态链接指定gcc标志,即:
QMAKE_CXXFLAGS += -static
QMAKE_LFLAGS_WINDOWS += -static
这将导致(大)二进制文件,除了Windows系统DLL之外,没有任何外部依赖性。
(如果很重要:我的用例是构建不应该具有外部依赖项的COM进程内服务器DLL;我还使用了TEMPLATE=lib
和CONFIG += dll
)。