在Windows上部署Qt 5应用程序

Deploying Qt 5 App on Windows

本文关键字:应用程序 Qt 部署 Windows      更新时间:2023-10-16

我在QML中编写了几个应用程序(Qt5的一部分)。在我之前提出的一个问题中(https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x),我找到了在OS X上部署应用程序的解决方案(使用macdeployqt工具)。

在Windows上部署Qt4应用程序很容易:

  1. 您在发布模式下编译了它
  2. 您复制了必要的库(DLL)
  3. 你测试了一下,结果成功了

不幸的是,这种方法在Qt5中不起作用(我甚至在qwindows.dll文件中包含了platforms文件夹,但它不起作用)。经过几天的尝试,我放弃了,编译了Qt5的静态版本。

同样,它没有起作用。该应用程序在安装了Qt的电脑上运行,但在"干净"的电脑上会崩溃。顺便说一句,Windows 8/8.1系统不会发出警告或消息通知我该应用程序崩溃。但在Windows7中,一条消息通知我应用程序崩溃了。

我试过运行DependencyWalker(dependent.exe),我的应用程序的静态构建中的所有库似乎都很好。

在Windows8中,我没有收到任何错误。但是在dependens.exe中分析该应用程序后,我收到了来自QtGui.dll的访问违规。确切的错误是

在地址0x61C2C000的"QT5GUI.DLL"中发生第二次机会异常0xC0000005(访问违规)。

是否缺少某些东西(比如一个额外的DLL或配置文件)?

应用信息:

  • 使用Qt 5.2.1编写和编译
  • 使用Quick/QML
  • 使用网络模块
  • 使用webkit模块
  • 使用蓝牙模块
  • QML文件是用Quick 2.2编写的

从Qt 5.2开始,您可以使用windeployqt工具。只需从命令行运行即可获得帮助。但基本用法是,给它一个.exe文件,它会复制Qt依赖关系。

您将希望使用--qmldir选项让工具知道QML文件的位置,这样它就可以计算出所需的QML依赖关系。

关于测试的注意事项:为了确保您拥有一切,请在没有Qt SDK的计算机上进行测试,或者暂时重命名Qt目录。否则,应用程序可能会从中找到丢失的文件。。。

在Qt论坛中挖掘了几个小时后,我发现我需要将"qml"文件夹(通常位于C:\Qt/5.2.1/qml中)复制到应用程序的根目录中。在这样做之后,我的应用程序的动态和静态版本都在普通系统上运行。


程序目录(MinGW 4.8 32位,动态):

正如hyde所说,使用windeployqt工具(<qt path><version>binwindeployqt.exe)将必要的文件复制到应用程序的文件夹中。之后,将所需的QML组件从<qt path><version>qml复制到应用程序的文件夹中。生成的文件夹应类似于:

  • 平台(文件夹)
  • QtQuick(文件夹)
  • QtQuick.2(文件夹)
  • 您需要的任何其他QML组件
  • app.exe
  • icudt51.dll
  • icuin51.dll
  • icuuc51.dll
  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwindthread-1.dll
  • Qt5Core.dll
  • Qt5Guid.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

程序目录(静态)

静态编译应用程序,然后将所需的QML组件从<qt path><version>qml复制到应用程序的文件夹中。生成的文件夹应类似于:

  • QtQuick(文件夹)
  • QtQuick.2(文件夹)
  • 您需要的任何其他QML组件
  • app.exe

我认为崩溃的原因是Qt5Gui.dll(动态和静态)在运行时"尝试"加载QtQuick*文件夹,但找不到它们(因此在加载过程中导致应用程序崩溃)。