在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应用程序非常简单:
- 你编译它在发布模式。
- 您复制了必要的库(DLL)。
- 你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它们(从而在加载期间崩溃应用程序)。