我在QML中编写了几个应用程序(Qt 5的一部分)。在我之前提出的一个问题(https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x)中,我找到了在OS X上部署我的应用程序的解决方案(使用macdeployqt工具)。
在Windows上部署Qt4应用程序非常简单:
不幸的是,这种方法在Qt5中不起作用(我甚至在qwindows.dll文件中包含了platforms文件夹,但它没有用)。经过几天的尝试,我放弃并编译了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或配置文件)?
申请信息:
答案 0 :(得分:34)
从Qt 5.2开始,您可以使用windeployqt
工具。只需从命令行运行它即可获得帮助。但基本用法是,给它.exe文件,它将复制Qt依赖项以便与它一起使用。
您将需要使用--qmldir
选项让工具知道您的QML文件的位置,以便它可以找出所需的QML依赖项。
关于测试的注意事项:确保您拥有所有内容,在没有Qt SDK的计算机上进行测试,或者临时重命名 Qt目录。否则应用程序可能会从那里找到丢失的文件......
答案 1 :(得分:21)
在Qt论坛中挖了几个小时后,我发现我需要将“qml”文件夹(通常位于C:/Qt/5.2.1/qml)复制到应用程序的根目录。在这样做之后,我的应用程序的动态和静态版本都在vanilla系统上运行。
程序目录(MinGW 4.8 32位,动态):
正如hyde所述,使用windeployqt
工具(<qt path>\<version>\bin\windeployqt.exe
)将必要的文件复制到应用程序的文件夹中。之后,将所需的QML组件从<qt path>\<version>\qml\
复制到应用程序的文件夹中。生成的文件夹应类似于:
程序目录(静态)
静态编译应用程序,然后将所需的QML组件从<qt path>\<version>\qml\
复制到应用程序的文件夹中。生成的文件夹应类似于:
我认为崩溃的原因是Qt5Gui.dll
(动态和静态)“试图”在运行时加载QtQuick *文件夹,但找不到它们(因此在加载期间崩溃应用程序)。