近期刚刚学会用qml写QT程序,感觉QML写界面真的是要好很多的,尤其是在写一些移动端的应用的时候。
最近在打包发布程序的时候遇到些问题,已经完美解决,希望给遇到同样问题的Qter一些参考。
以前在打包Qwiget的程序的时候,一般是在编译release版本后,直接点击exe文件,把提示缺少的dll文件放在一起即可。但是这次直接点击exe文件后,提示的是0xc000007b错误代码。
在网上搜索解决方案后决定采用http://tieba.baidu.com/p/3730103947 中提到的windeployqt工具,但是按照这个方法做完以后,依赖库是拷贝了很多,但是点击主应用程序,竟然没有反应!
后来又发现了这个帖子http://blog.csdn.net/jhkdiy/article/details/65443782,上面说拷贝过来的QCore.dll和系统安装包中的md5值不一样,真是神奇,按照上面的方法替换了QCore文件后,果然可以运行了,于是自以为解决了问题,美滋滋。
第二天,程序要给别人演示了,由于我的开发机是台式机,于是找了个笔记本把打包好的程序拷贝进去,点击,竟然不能运行!
于是又是半天的搜索,终于找到了另一个帖子http://bbs.csdn.net/topics/391051284,上面虽然没有解决根本问题,但是也提出了一个解决表面的方案。于是我按照上面的方法在笔记本上一模一样的建立了一个到qml的路径,并把qml文件夹中的所有文件一并拷走,程序完美运行,蒙混过关了展示。
展示结束后,我试着找打包失败的原因。一个朋友和我说他在使用中没有出现过我说的问题,于是我就怀疑是不是我使用了什么奇怪的库才这样的。首先,我又重新建立了一个新的helloworld程序,里面用到的组件尽可能的少,打包发布后,拷贝到其他电脑,完美运行。证明我的猜想是对的,确实是我使用了一些不该使用的控件。
第二步,我安装了一个叫proceexp的软件,用来看看这个软件到底是在使用什么依赖库,在我的开发机中将程序运行起来,用procexp来监测其使用到的动态链接库。
可以看到,使用了很多动态链接库,有的在C盘,推测应该是使用系统的接口,有的在应用所在文件夹,这些就是打包程序拷贝过来的依赖库。但是还有一些,如下图,竟然是在我的Qt开发环境下的,这些东西在别的计算机没有啊,自然也就不能运行了。后来仔细想想,当初我是把qml文件夹拷贝过去就导致程序能运行了,那应该程序的运行和mingw53_32文件夹的东西应该关系也不大,而问题的关键应该是这个qml文件夹下的qmllocalstrongeplugin.dll,根据名字,这个动态链接库实际上为qml中直接使用sqlite数据库进行支持的,而我恰好使用了这一功能。
在打包工具打包好的软件目录中,巧好有一个QtQuick文件夹,里面没有LocalStorage文件夹,于是我手动从开发环境安装目录把这个文件夹拷贝了过来。再点击运行程序,已经没有调用D盘的qmllocalstrongeplugin.dll文件了,转而变成了这个
这说明在软件根目录包含了qmllocalstrongeplugin.dll后,软件进行了优先使用,而不是去系统的环境变量中去查找。
为了验证这个想法,我把改进后的软件包拷贝到其他计算机进行运行,结果是可以运行的。问题得以解决。
总结一下,windeployqt作为一个优秀的软件打包工具,确实为开发者带来了不少方便。但是其仍存在一定的bug,在开发者使用较多的库后,会出现拷贝依赖库不全的情况。在以后有类似的情况发生时,可以用procexp软件看看有什么必要的依赖库是在开发环境安装目录的,手动添加即可。
本文出自 “9904124” 博客,请务必保留此出处http://9914124.blog.51cto.com/9904124/1961505
原文地址:http://9914124.blog.51cto.com/9904124/1961505