QT发布程序QML程序不正常不工作windeployqt无法导出qml依赖无法显示qml界面图片发布程序的过程vs+qt

QT发布程序QML程序不正常不工作windeployqt无法导出qml依赖无法显示qml界面图片发布程序的过程

最近要发布一个qt程序,其中程序和依赖库都是由qt和qml开发实现的,qt可以用windeployqt命令实现自动收集qt依赖的功能,所以下面的过程是用qt自带的windeployqt工具收集qt相关依赖,以及碰到的问题的解决方案。如果您学会了,请忽略。
如果没有引用到qml,请忽略。

第一步 启动命令行

cmd
最快捷的方式,就是在要执行命令的目录 地址栏中输入cmd

两个需要注意的事项:
1、后面的演示,都是用release版本,msvc+qt编译的程序取依赖,如果您跟我一样,那么就可以参照我的操作。如果您使用的是Debug,记得收集的qt库,应该是*d.dll(例如Qt5Cored.dll,而release则是不带d)。
2、您还需要注意,用vs+qt编译的qt依赖,来自msvc**的目录,用mingW编译的qt依赖,来自mingW的目录,不能混用。

第二步 运行vcvars64.bat

“D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat”

运行这个的目的是为了收集vs的依赖,如果您的程序是qtcreator生成的,可以忽略这个步骤。只有在vs+qt生成的程序时才执行。
注意上面的文件路径,是我电脑安装vs2017的路径,您需要根据自己的vs版本进行相应的调整,但是执行的文件名是相同的。

第三步 执行windeployqt命令

windeployqt [你的程序名或者动态库]

下面是举例:

windeployqt chapter1-basics.exe

一般情况下,命令能够自动判断是debug或者Release版本
同时也可以指定参数

windeployqt chapter1-basics.exe --Debug
windeployqt chapter1-basics.exe --Release

当需要依赖QML时,需要指定命令参数:

windeployqt chapter1-basics.exe --qmldir D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\qml

–qmldir [您安装的qt的目录下的qml]
这里需要注意区分,编译qt时是mingW还是msvc版本的qt

如果您的命令执行完后正常,如下图所示,能够收集到qt依赖库以及qml相关依赖,那么您可以直接找一台没有安装qt环境的机器测试是否能够正常显示,正常执行了。
下面的问题,是因为命令执行的结果不正常,没有手机到qml相关的依赖,所以才产生的问题…

问题一 windeployqt不能收集qml相关依赖

正常情况,使用命令能够收集所有依赖
windeployqt chapter1-basics.exe --qmldir D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\qml

正常情况是下图这样:
在这里插入图片描述
未找到qml相关的依赖是这样子的:
在这里插入图片描述
也就是说如果您的命令行执行结果是正常的,那么恭喜您,您不会遇到我今天遇到的问题,可能问题一和问题二都不会有,那么直接可以脱离安装qt环境而直接可以运行
我的执行结果在公司电脑上是第二种异常情况,也就是说无论我是否指定–qmldir 这个命令参数,都不会有qml相关的依赖出现。如果是这样,那么我是执行下面的方法解决的。

1、拷贝Qt5QuickControls2.dll,注意引用的qt环境以及版本问题
2、对Qt5QuickControls2.dll库执行windeployqt命令:

windeployqt --qmldir D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\qml Qt5QuickControls2.dll

说明一下,这个dll和exe在命令行的位置并不重要
执行这个命令,关于qml的依赖就都加入进来了。

加入后,对程序进行运行测试,出现了第二个问题:

问题二 运行程序qml界面显示不正常

正常应该是这样的:
在这里插入图片描述
不正常是这样的:
在这里插入图片描述
也就是说,程序能够正常启动,但是qml相关的东西却不能正常显示。为了找出原因。我花了很长时间进行了排查,发现:
1、安装完整的qt环境,并将bin目录加入path环境变量后,程序可以正常运行。
2、不安装qt环境,通过windeployqt方式,获取qt环境,则不能正常显示;
3、通过windeploy方式获取qt环境,并且安装qt环境,还是不能正常显示;
4、通过windeploy方式获取qt环境,并且安装qt环境,删掉exe目录下的Qt5Core.dll(因为通过windeployqt会收集到此库),能正常显示;
说明,不能显示的原因在Qt5Core.dll库上,那么,我重新拷贝一份,还是不行。

解决方案:
将[QT安装目录]\bin\qt.conf文件拷贝到Qt5Core.dll目录,并修改该文件中的:
Prefix=…
其中…为上级目录,也就是说告诉Qt5Core.dll的plugins目录和qml目录的位置。
例如我修改为:
Prefix=./pQ
那么,我应该将plugins目录内容和qml目录内容放到pQ目录下,并将pQ目录放到Qt5Core.dll同级目录即可。

到此,如果还显示不正常,则需要使用[Qt安装目录]\qml文件夹中,将下图中的:
在这里插入图片描述
将安装目录下的这些目录复制替换掉上述目录即可,因为可能命令收集的不全的问题。

注意:
使用windeployqt收集的依赖,都在同一目录下。那么需要将上述Qt开头的目录全部放到qml目录中;其他的目录来自plugins目录,所以建立plugins目录,并将qml目录和plugins目录放置到pQ目录下。
在这里插入图片描述
至此,我的问题已经解决,在未安装qt环境的机器上,程序能够正常运行,qml显示正常。
希望我这个解决过程能够解决您的问题,或者希望能够带给您新的启示。

猜你喜欢

转载自blog.csdn.net/myhappyandy/article/details/130534970
今日推荐