Qt静态链接和部署

时间:2009-06-18 07:10:07

标签: windows qt deployment static

我正在尝试部署(向公众发布)我最近制作的一个简单的qt应用程序,但却陷入静态链接qt库。

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

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

7 个答案:

答案 0 :(得分:42)

我写了a guide to static linking

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

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

    -static选项应传递给configure

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

    -static-runtime选项应传递给configure

  3. 您想要XP定位吗?

    -target xp选项应传递给configure

    此外,请按照this blog post

    中的说明操作

    Qt Creator至少在v.3.5.0之前不支持XP自动定位,因为它没有正确设置构建工具的环境。您必须手动修改构建环境per the blog post

答案 2 :(得分:6)

另外,请注意,静态构建仍将动态链接到visual studio运行时!

请参阅this faqinternet 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=libCONFIG += dll)。