2014-03-04 62 views
29

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

部署在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
  • 编译使用快速/ QML。
  • 使用网络模块。
  • 使用webkit模块。
  • 使用蓝牙模块。
  • 的QML文件都写在快速2.2
+0

什么是确切的错误?你有没有发生崩溃转储?你有没有尝试以某种方式分析崩溃转储? –

+0

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

+1

确切的错误是“地址0x61C2C000”QT5GUI.DLL“中发生第二次机会异常0xC0000005(访问冲突)。” –

回答

18

几个小时在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组件.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(文件夹)
  • ,你需要
  • APP.EXE
任何其他QML组件

我认为坠机原因是,Qt5Gui.dll(动态和静态)“试图”加载QtQuick * FO在运行时,但无法找到它们(因此在加载过程中使应用程序崩溃)。

+0

对于静态版本:应该不可能在您的.exe文件中包含所需的qml文件吗? – bobbaluba

+0

我还必须复制C:\ Windows \ System32 \ msvcr110d.dll和C:\ Windows \ System32 \ msvcp110d.dll以使调试版本的部署工作。 (不需要发布版本,但添加此注释以防万一有人在此尝试将调试版本部署到未安装调试运行时的系统上。) – wrdieter

+1

*“我发现需要复制”qml“文件夹“*您是否尝试使用”--qmldir“选项? – Ilya

29

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

你将要使用--qmldir选项,让工具知道你的QML文件,因此它可以计算出所需要的QML依赖。

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

+1

我使用这个工具来部署我的动态应用程序,正如你所说的那样,它有QML文件夹的问题。为了解决这个问题,我只是复制了 /5.2.1/qml文件夹。部署的应用程序在没有安装Qt SDK的系统上工作。 –

+3

我的'windeployqt.exe' v5.7.0错过了我的32位二进制文​​件的三个依赖:'libgcc_s_dw2-1.dll','libstdC++ - 6.dll'和'libwinpthread-1.dll'。必须从'\ Qt \ 5.7 \ mingw53_32 \ bin'手动添加它们。 – TranslucentCloud