我在QML中编写了几个应用程序(Qt5的一部分)。在我之前提出的一个问题中(https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x),我找到了在OS X上部署应用程序的解决方案(使用macdeployqt工具)。
在Windows上部署Qt4应用程序很容易:
- 您在发布模式下编译了它
- 您复制了必要的库(DLL)
- 你测试了一下,结果成功了
不幸的是,这种方法在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*文件夹,但找不到它们(因此在加载过程中导致应用程序崩溃)。