Qt5在程序打包发布时遇到的问题和解决方法

近期刚刚学会用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软件看看有什么必要的依赖库是在开发环境安装目录的,手动添加即可。

时间: 2024-10-10 01:35:32

Qt5在程序打包发布时遇到的问题和解决方法的相关文章

Windows下程序打包发布时的小技巧(使用Dependency Walker侦测不理想,改用VS自带的dumpbin则万无一失,还可查看dll导出的函数)

Windows下开发的应用程序在发布时,需要将其依赖的一些动态链接库一起打进安装包里面去.这个时候,快速确定这个程序到底依赖哪些动态链接库变得非常重要.很久以前写过一篇关于Qt程序安装包制作的博客,里面介绍了Dependency Walker这个小工具.但是实际操作起来并不理想,因为Dependency Walker将exe文件依赖的所有动态库以及动态库所依赖的动态库都列出来了.看得你一脸懵逼: 你很难分清楚:倒底哪些DLL是需要打包的,哪些DLL是系统自带的.而作为打包过程中的一个小步骤,我根

Qt5+opencv程序打包发布

编程环境为win7+QtCreator5.6+opencv3.0,总结,程序打包发布的方法: 第一步:使用windeployqt(转自http://tieba.baidu.com/p/3730103947,感谢楼主分享) Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll, 如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行. 因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe. 以官方 Qt 5.4.0+MinG

springboot打包发布tomcat遇到的bug及解决方法

1.--  在打包发布springboot时,先在pom.xml中把springboot内嵌的tomcat去掉,这样打包的时候就不会打tomcat的jar包 如下所示: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除内置容

在启动php时,无法启动此程序,由于计算机中丢失MSVCR110.dll的解决方法

在启动php时,运行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,由于计算机中丢失MSVCR110.dll 方法/步骤 首先进入 http://www.microsoft.com/zh-CN/download/details.aspx? id=30679 这个网址来进行相关程序的下载. 打开之后,在"选择语言"里选择"中文简体".然后点击右边的"下载"but

在启动php时,无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法

在启动php时,执行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,因为计算机中丢失MSVCR110.dll 方法/步骤 首先进入 http://www.microsoft.com/zh-CN/download/details.aspx?id=30679 这个网址来进行相关程序的下载. 打开之后,在"选择语言"里选择"简体中文",然后点击右边的"下载"按钮.这

小程序上拉下拉共存时不可使用scroll-view的解决方法

使用 bindscrolltolower ,必须搭配使用的 scroll-view 会导致小程序 "enablePullDownRefresh": true 下拉不能使用. 解决方法,就是当两者同时存在时,改 scroll-view 为 view ,改 bindscrolltolower 为 onReachBottom 函数. 这样在上拉加载,跟下拉刷新同时存在的时候, "enablePullDownRefresh": true 就可以生效了. wxml <v

执行游戏时出现0xc000007b错误的解决方法

如图,这个错误使无数玩家烦恼. 出现这个错误,可能是硬件的问题,也可能是软件的问题.可是,因为硬件引起该问题的概率非常小,而且除了更换硬件之外没有更好的解决方法,因此本文将具体介绍怎样通过软件解决此问题,这也是大家最关心的. 大致介绍一下这个错误是怎样发生的.这个错误的本意是提示内存错误,可是通常情况下并非内存存在问题,而是因为软件的问题产生了这个错误.到底是什么软件的问题呢?答案是DirectX,而且多数情况下是DirectX 9.0的问题. 或许大家会问了:我玩的游戏都有DirextX 11

配置WebSite的IIS时遇到的问题与解决方法

1: Server Error Internet Information Services 7.5 Error Summary HTTP Error 500.19 - Internal Server Error The requested page cannot be accessed because the related configuration data for the page is invalid. Detailed Error Information Module IIS Web

linux下安装Oracle时交换空间不足的解决方法

摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本文的第二种方法, 至于第一种方法应该是安装系统时设置交换区. 1.使用分区: 在安装OS时划分出专门的交换分区,空间大小要事先规划好,启动系统时自动进行mount. 这种方法只能在安装OS时设定,一旦设定好不容易改变,除非重装系统. 2.使用swapfile:(或者是整个空闲分区) 新建临时swap