Qt5在程序打包发布时遇到的问题和解决方法-创新互联
近期刚刚学会用qml写QT程序,感觉QML写界面真的是要好很多的,尤其是在写一些移动端的应用的时候。
10年的珠晖网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整珠晖建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“珠晖网站设计”,“珠晖网站推广”以来,每个客户项目都认真落实执行。最近在打包发布程序的时候遇到些问题,已经完美解决,希望给遇到同样问题的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软件看看有什么必要的依赖库是在开发环境安装目录的,手动添加即可。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前题目:Qt5在程序打包发布时遇到的问题和解决方法-创新互联
当前URL:http://scyanting.com/article/dsgggj.html