Qt静态链接和部署


71

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

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

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


1
您是否有QtCore4.a,QtGui4.a的静态副本?然后添加即可CONFIG += static解决此问题。如果您没有Qt的静态副本,请获取源代码并进行构建。获取静态库需要几个小时。
美龄Minhazul哈克

Answers:


46

我写了一个静态链接指南

以及 如何使用多个编译器构建Qt static并保持较小

(因为它可能会变得很大,尤其是对于简单程序而言)。您可能还需要检查BitRock安装程序,该程序对于开源项目是免费的。

简而言之,如果您将Qt认为是插件的任何东西使用,例如对大多数图像类型(JPEG,GIF)或数据库的支持,则要复杂一些。例如,如果要包括对图标的Oracle DBMS和GIF图像的支持,请将以下内容添加到.PRO文件中:

QTPLUGIN += qsqloci qgif
CONFIG += static

然后,您需要:

#include <QtPlugin>

在您的项目中,并导入所有使用的插件。您需要更改这些设置,以便使其能够再次通过动态链接进行编译(例如在调试或添加功能时),尽管这可以轻松实现自动化。构建Qt库以用于静态链接时,还需要考虑一些因素,尽管Qt指令至少可以帮助您入门。


15
如果您静态链接,请注意许可问题。
丽莎

4
下面的Wayback Machine链接。第一个链接是有关Qt4到应用程序静态链接的文章。第二个链接是有关将Qt缩小并能够进行静态链接的文章。 web.archive.org/web/20120729010312/http://www.formortals.com/... web.archive.org/web/20120723142656/http://www.formortals.com/...
EMPraptor

3
@JaredGlass您将很高兴知道链接已备份。
查尔斯·伯恩斯

@CharlesBurns,嗯,又被打破了吗?
FRD 2013年


19

使用Qt 5.5,事情变得很容易。configure构建Qt时,您需要传递以下正交设置:

  1. 您是否需要静态Qt库?

    -static 选项应传递给 configure

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

    -static-runtime 选项应传递给 configure

  3. 您要XP定位吗?

    -target xp 选项应传递给 configure

    此外,请按照此博客文章中的说明进行操作。

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


configure==配置?
user2962533

2
@ user2962533不,这与configure在构建Qt本身之前运行的脚本有关。
库巴并没有忘记莫妮卡

8

另外,请注意,您的静态构建仍将动态链接到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


4

msys2具有预构建的静态Qt5软件包

例如 pacman -S mingw-w64-qt5-static

当前,要获得与CMake静态链接的Qt的所有依赖项,您需要添加:
list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
在调用find_package(Qt5…之前。


CMAKE_AUTOSTATICPLUGINS 已由新的上游实施替换,并且不再需要。


我想使用它,但是我不确定如何设置CMAKE_AUTOSTATICPLUGINS。我先用qmake然后用make。你能建议吗?
tofutim

您是否qmake在此处输入错误,因为这是关于CMake的。您可以将其设置为全局:set(CMAKE_AUTOSTATICPLUGINS ON)或作为目标特定属性:set_target_properties(${PROJECT_NAME} PROPERTIES AUTOSTATICPLUGINS ON)
Darklighter '18

3

我只是使用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

凯文·希金斯


很好,这对我有所帮助,我丢失了您在这里提到的.lib之一,并得到了有线链接错误,非常感谢

嗨,凯文!感谢分享!请问您使用什么配置来构建带有静态链接的qt?我转到Src文件夹并执行:“ configure -platform win32-msvc -static -release -nomake示例-nomake tests -opensource”,并且我还注意到,在您的答案中,与之链接的库是调试库,所以我更改为发行版之一,当然仍然会出现链接错误。我想我将不得不再次重新构建qt并尝试构建以进行调试和发布

2

我建议您使用linuxdeployqt这个工具。它可以帮助解决大多数依赖问题。我使用它成功打包了我的qt应用程序。


0

此答案适用于在Windows和qmake中将MSYS2mingw-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=libCONFIG += dll)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.