Qt5在打包发布时遇到的一些问题
2017-08-31 19:09
387 查看
近期刚刚学会用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,在开发者使用较多的库后,会出现拷贝依赖库不全的情况。在以后有类似的情况发生时
4000
,可以用procexp软件看看有什么必要的依赖库是在开发环境安装目录的,手动添加即可。
最近在打包发布程序的时候遇到些问题,已经完美解决,希望给遇到同样问题的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,在开发者使用较多的库后,会出现拷贝依赖库不全的情况。在以后有类似的情况发生时
4000
,可以用procexp软件看看有什么必要的依赖库是在开发环境安装目录的,手动添加即可。
相关文章推荐
- ios打包遇到的一些小问题
- Maven打包遇到的一些问题
- Maven打包遇到的一些问题(zhuan)
- 卸载之前node.js,采用nvm后npm install及打包编译遇到的一些问题
- 服务器端部署IIS8.5和asp.net MVC5.0发布网站遇到的一些问题
- cocos2d-x3.0rc打包apk遇到的一些问题记录
- 【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题
- Storm编译打包过程中遇到的一些问题及解决方法
- 通过IIS发布网站遇到的一些问题整理
- spark:学习过程中遇到的一些问题及解决方法(如何将本地文件发布到HDFS)--11
- qt5 编译一些问题 还有打包的dll依赖
- 关于vueThink框架打包发布的一些问题
- 今天在发布IIS站点的时候遇到了一些问题
- Ionic Android编译打包过程中遇到的一些问题及解决方案(ionic cordova build android)
- WCF服务在IIS发布时遇到的一些配置问题
- iOS 发布遇到的一些问题
- Android studio webApp打包遇到的一些问题
- 在云主机发布项目遇到的一些问题
- Windows软件发布时遇到的一些问题
- Android Studio打包APK是遇到的一些问题(Lint检查的错误)