在 Windows 上部署 Qt 5 应用程序
Posted
技术标签:
【中文标题】在 Windows 上部署 Qt 5 应用程序【英文标题】:Deploying Qt 5 App on Windows 【发布时间】:2014-03-04 01:06:58 【问题描述】:我已经用 QML(Qt 5 的一部分)编写了几个应用程序。在我之前提出的问题 (https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x) 中,我找到了在 OS X 上部署我的应用程序的解决方案(使用 macdeployqt 工具)。
在 Windows 上部署 Qt4 应用程序很容易:
-
你是在发布模式下编译的。
您复制了必要的库 (DLL)。
您进行了测试,并且成功了。
不幸的是,这种方法在 Qt5 中不起作用(我什至在 qwindows.dll 文件中包含了平台文件夹,但它不起作用)。经过几天的尝试,我放弃并编译了Qt5的静态版本。
再次,它没有工作。该应用程序可以在安装了 Qt 的 PC 上运行,但在“干净”的 PC 上会崩溃。附带说明一下,Windows 8/8.1 系统不会发出警告或消息通知我有关应用程序崩溃的信息。但在 Windows 7 中,一条消息通知我应用程序崩溃了。
我已尝试运行 Dependency Walker (depends.exe),我的应用程序静态构建中的所有库似乎都很好。
在 Windows 8 中,我没有收到任何错误。但是在对depends.exe 中的应用程序进行分析后,我收到了源自QtGui.dll 的访问冲突。确切的错误是
在地址 0x61C2C000 的“QT5GUI.DLL”中发生第二次机会异常 0xC0000005(访问冲突)。
我是否缺少某些东西(比如额外的 DLL 或配置文件)?
申请信息:
使用 Qt 5.2.1 编写和编译 使用 Quick/QML。 使用网络模块。 使用 webkit 模块。 使用蓝牙模块。 QML 文件是用 Quick 2.2 编写的【问题讨论】:
确切的错误是什么?你有崩溃转储吗?您是否尝试以某种方式分析所述故障转储? 确切的错误是“第二次机会异常 0xC0000005(访问冲突)发生在地址 0x61C2C000 的“QT5GUI.DLL”中。” 说实话真的很烂。为什么他们不能只制作一个部署按钮并完成它。 绝对可以,@GeneCode。这就是为什么 OP 称它为“简单”的原因,因为任何 3 岁的“需要复制的 DLL”都可以告诉你所有相关信息;-) 5 年过去了,到了 2020 年,部署一个微不足道的 Qt 应用程序变成了一场噩梦。 【参考方案1】:从 Qt 5.2 开始,您可以使用 windeployqt
工具。只需从命令行运行它即可获得帮助。但基本用法是,给它.exe文件,它会复制Qt依赖项。
您需要使用--qmldir
选项让该工具知道您的 QML 文件在哪里,以便它可以找出所需的 QML 依赖项。
关于测试的注意事项:为确保您拥有一切,请在没有 Qt SDK 的计算机上进行测试,或者暂时重命名 Qt 目录。否则应用程序可能会从那里找到丢失的文件...
【讨论】:
我使用这个工具来部署我的动态应用程序,正如你所说,它与 QML 文件夹有问题。为了解决这个问题,我只是复制了windeployqt.exe
v5.7.0 错过了我的 32 位二进制文件的三个依赖项:libgcc_s_dw2-1.dll
、libstdc++-6.dll
和 libwinpthread-1.dll
。必须从 \Qt\5.7\mingw53_32\bin
手动添加它们。
'''windeployqt''' 也不能像这里宣传的那样工作,如果有的话。也许人们应该坚持使用 Linux 以保持工作正常。
@dotbit windeployqt
是一个辅助工具,你仍然需要知道你在做什么。而且在“Linux”上部署肯定不会更容易,你仍然需要知道你在做什么(特别是如果你需要支持多个不同的发行版)。
mapviewer 是我的根目录源代码的示例:windeployqt --qmldir C:\Users\ADMIN\Documents\workspace\map\mapviewer qml_location_mapviewer.exe【参考方案2】:
在 Qt 论坛中挖掘了几个小时后,我发现我需要将“qml”文件夹(通常位于 C:/Qt/5.2.1/qml)复制到应用程序的根目录。这样做之后,我的应用程序的动态和静态版本都可以在 vanilla 系统上运行。
程序目录(MinGW 4.8 32 位,动态):
正如hyde 所说,使用windeployqt
工具(<qt path>\<version>\bin\windeployqt.exe
)将必要的文件复制到应用程序的文件夹中。之后,将所需的 QML 组件从 <qt path>\<version>\qml\
复制到应用程序的文件夹中。生成的文件夹应类似于:
程序目录(静态)
静态编译应用程序,然后将所需的 QML 组件从 <qt path>\<version>\qml\
复制到应用程序的文件夹中。生成的文件夹应类似于:
我认为崩溃的原因是Qt5Gui.dll
(动态和静态)在运行时“尝试”加载 QtQuick* 文件夹,但找不到它们(因此在加载期间导致应用程序崩溃)。
【讨论】:
对于静态版本:是否可以在 .exe 文件中包含所需的 qml 文件? 我还必须复制 C:\Windows\System32\msvcr110d.dll 和 C:\Windows\System32\msvcp110d.dll 才能使部署工作用于调试构建。 (对于发布版本不是必需的,但添加此注释以防万一有人试图将调试版本部署到未安装调试运行时的系统。) “我发现我需要复制“qml”文件夹”你尝试了--qmldir
选项吗?
新版本如Qt5.7,qml
路径如<QTDIR>\5.7\msvc2013\qml
。
简而言之:部署一个琐碎的 hello-win-horror-world 应用程序至少需要 48 小时,因为它是一种黑色艺术,可能会工作或失败,具体取决于月相。
以上是关于在 Windows 上部署 Qt 5 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 windows xp 上部署 Qt 5.10 Quick 2 应用程序?
如何在Windows XP上部署Qt 5.10 Quick 2应用程序?
如何将基于 qt 的应用程序(在 Mac 上开发)部署到 Windows?
在 Mac 和 Windows 上部署 Qt+Boost 应用程序