一:先解析下我的环境:
1:QT平台: qt-opensource-windows-x86-mingw530-5.7.1
2:系统:Win7 64位平台
3:使用QT quick control 2.0 版本
4:本程序的名字位 Btc.exe
5:本程序使用windeployqt打包的目录如下:
二:现象
1:使用QML页面开发,没有使用特殊的硬件。
2:在QT Creator 中正常运行,正常显示。
3:使用windeployqt的打包工具打包后直接双击运行程序,报错:
4:使用windeployqt打包Release版本的程序,单独运行程序无反应,但在任务管理器中存在进程。
5:如果将程序放在 QT的MinGW环境下又能正常运行,我这边的QT路径是:D:\Qt\Qt5.7.1\5.7\mingw53_32\bin。
三:解决过程
为什么在QT Creator中运行正常,而且把程序放在mingw的bin目录下也正常,使用windeployqt打包的直接双击运行却无法显示。
1:既然能在mingw的环境运行,于是我把整个mingw的bin目录所有文件都搬过来,想不到文件有2.3G多。但是程序依然运行不显示。
2:一开始使用windeployqt打包直接运行报错,但错误提示清晰,很好解决,把三个dll加进去即可:
libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll
3:放进去之后双击运行程序没有报任何错误,在任务管理器里也又进程,只是不显示界面。
4:把程序目录里文件夹移到程序外面,然后再双击运行,报错:
5:好吧,提示有“”platform“”字样,于是把 之前产生的platforms文件夹放回到程序目录里,结果没报错,但是依然不显示界面。
6:在上面的基础上,再把 mingw 的bin目录里的所有dll文件复制到当前程序目录里,竟然正常运行,但是所有文件加起来有2.3G,于是进行裁剪,把很多明确不需要
的Debug版本的dll清除了,最后清理到只有20多MB。
7:以为这样可以解决了,但还是不明白原因,于是继续追查,对比从mingw的bin目录复制过来的dll和windeployqt打包的dll,以为是windeployqt把一些dll漏掉了,但是
结果为false,因为windeployqt打包的dll更多:
8:继续追击,我检查了DLL的文件大小,发现都一样,百思不得其解,为什么windeployqt打包的dll反倒不能运行,最后我决定使用MD5校验
来检查,当检查到Qt5Core.dll的时候大吃一惊,他们的MD5不一样:
9:随后检查了其他的dll,发现MD5都一样,再次验证,把mingw的bin目录的Qt5Core.dll文件复制到程序不显示的目录里,双击运行程序,一切正常!
结论:
如果开发的QML程序运行没显示,可以尝试下列解决方法:
1:把windeployqt打包后的目录移到程序的上一层目录里。
2:如果是基于mingw的程序,记得把windeployqt打包的Qt5Core.dll文件替换为MinGW的bin目录里的同名文件。