在Windows上部署Qt 5应用程序

Ale*_*aru 33 c++ windows deployment qt

我在QML中编写了几个应用程序(Qt 5的一部分).在我之前提出的一个问题(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文件的平台文件夹,但它不起作用).经过几天的尝试,我放弃并编译了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编写的

hyd*_*yde 35

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

您将需要使用--qmldir选项让工具知道QML文件的位置,以便它可以找出所需的QML依赖项.

关于测试的注意事项:确保您拥有所有内容,在没有Qt SDK的计算机上进行测试,或者临时重命名 Qt目录.否则应用程序可能会从那里找到丢失的文件...

  • 我的`windeployqt.exe` v5.7.0错过了我的32位二进制文​​件的三个依赖项:`libgcc_s_dw2-1.dll`,`libstdc ++ - 6.dll`和`libwinpthread-1.dll`.不得不从`\ Qt\5.7\mingw53_32\bin`手动添加它们. (3认同)
  • 我使用这个工具来部署我的动态应用程序,正如你所说,它有QML文件夹的问题.为了解决这个问题,我只是复制了<qt-path> /5.2.1/qml中的文件夹.部署的应用程序在没有安装Qt SDK的系统上运行. (2认同)

Ale*_*aru 21

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


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

正如hyde所说,使用windeployqt工具(<qt path>\<version>\bin\windeployqt.exe)将nescesary文件复制到应用程序的文件夹中.之后,将所需的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
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

程序目录(静态)

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

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

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

  • *“我发现我需要复制” qml“文件夹” *您是否尝试了`--qmldir`选项? (2认同)