在Windows上部署Qt 5应用程序

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

在Windows上部署Qt4应用程序非常简单:

  1. 你编译它在发布模式。
  2. 您复制了必要的库(DLL)。
  3. 你testing过,它的工作。

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

再次,它没有工作。 该应用程序在安装了Qt的PC上运行,但是在“干净的”PC上崩溃。 作为一个侧面说明,Windows 8 / 8.1系统不会给出关于应用程序崩溃的警告或消息。 但是在Windows 7中,有消息告诉我应用程序崩溃了。

我试过运行Dependency Walker(depend.exe),我的应用程序的静态构build中的所有库看起来都很好。

在Windows 8中,我没有得到任何错误。 但是在使用depends.exe分析应用程序之后,我得到了源自QtGui.dll的访问冲突。 确切的错误是

地址0x61C2C000处的“QT5GUI.DLL”中发生第二次机会exception0xC0000005(访问冲突)。

有什么,我失踪(说一个额外的DLL或configuration文件)?

申请信息:

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

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

您将需要使用--qmldir选项让工具知道您的QML文件在哪里,因此可以计算出所需的QML依赖关系。

关于testing的注意事项:确保你拥有一切,在没有Qt SDK的计算机上testing,或者暂时重命名 Qt目录。 否则应用程序可能会从那里find丢失的文件…

经过几个小时的Qt论坛挖掘,我发现我需要将“qml”文件夹(通常位于C:/Qt/5.2.1/qml)复制到应用程序的根目录。 这样做后,我的应用程序的dynamic和静态版本在香草系统工作。


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

正如海德所说,使用windeployqt工具( <qt path>\<version>\bin\windeployqt.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
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

程序目录(静态)

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

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

我认为导致崩溃的原因是Qt5Gui.dll(dynamic和静态)“试图”在运行时加载QtQuick *文件夹,但无法find它们(从而在加载期间崩溃应用程序)。