当我们用Qt Creator开发编译完成一个程序后,通过点击Qt Creator界面左下角的“运行(Run)”按钮,能够正常运行程序。但当我们找到编译输出目录,想要双击exe文件直接运行程序时,会报丢失dll文件的系统错误[衰](如图1)。这是由于程序运行所需的各种动态库还没有被包含进去。程序的打包发布就是将程序运行所必需的动态库添加完整的过程。
另外,在没有专门设置图标前,刚开发的程序(如图1中的例子samp1.exe)的图标是一个简单的命令行图标,显得不是很专业[捂脸],在程序发布之前最好替换成你想要的图标。
图1. 直接运行的系统错误
在本篇文章中,我们首先给程序设置一个图标。编译通过后,将程序运行所需的文件打包,以便你能把程序分享给别人或在其他电脑上运行。打包后的文件体积有些大,我研究了一种能精简体积的方法。
一、设置程序图标
设置图标的方法有多种,这里作为小白当然选择一种最简单的方法[呲牙]。
首先准备一个ico图标文件。我在电脑上随便找了一个音乐形状的图标文件,将其复制到项目源文件目录中,并重命名为myico.ico,如图2所示。
图2. 准备图标文件
在Qt Creator中打开项目文件,在“Edit”界面下,双击打开项目文件“samp1.pro”。在文件末尾,添加一行“RC_ICONS = myico.ico”(注意等号前后各有一个空格)。
图3. 编辑项目文件添加图标
重新编译程序并运行。这时编译输出目录中samp1.exe的图标,以及程序运行界面左上角的图标,都已经替换为我们想要的图标了,如图4所示。
图4. 添加图标后的结果
二、打包发布程序
为了打包发布程序,首先新建一个文件夹(这里我在Projects下新建了文件夹samp1_pack),然后将想要打包的samp1.exe文件复制到该文件夹中,如图5所示。
图5. 准备打包目录
由于我的程序是用MinGW 64bit编译器编译的,因此在开始菜单中找到对应版本的Qt命令行工具(不能使用windows自带的cmd),点击运行。在命令界面,首先切换当前目录到打包目录(我的是D:\Qt\Projects\samp1_pack),然后运行打包命令“windeployqt samp1.exe”。
图6. 运行打包命令
命令运行完成后,在资源管理器中打开打包目录,发现除了原来的samp1.exe外,多出了很多dll文件和子目录(除了translations外其余目录中也是dll)。这些多出的东西基本都是动态链接库。对于一个几乎什么也不干的程序,打包后的体积约66MB,确实是不小了[捂脸]。
图7. 打包命令运行的结果
三、精简体积
Qt打包命令windeployqt比较全面的将动态库包含进来,但其实有些库是不需要的。想要精简打包文件夹的体积,必须要知道哪些文件是运行所必须的。
在Windows系统中,可以通过一个免费小软件Dependency Walker分析一下动态库的关联性。官网地址为:
打开Dependency Walker软件,点击左上角的“打开”按钮,找到我们打包的exe文件,然后点击“打开”按钮。注意这时不要进行任何操作,软件运行较慢(一动就显示未响应[捂脸]),耐心等待结束即可。
图8. 操作Dependency Walker软件打开文件
在得到分析结果后(如图9所示),我用红框标注出了在打包文件夹内存在的dll文件,这些都是运行必须的动态库。
图9. 动态库依赖性分析结果
将除了上面找到的dll文件以外其他的文件和文件夹全部删除,尝试运行程序,出现如图10所示的运行错误[衰]。注意到“Qt platform plugin”的提示,表明误删了Qt平台插件。于是将“platforms”文件夹恢复,之后程序终于能够正常运行了[抠鼻]。图11是精简之后最终保留的所有文件。
图10. 缺失平台插件错误
图11. 精简后的结果
精简之后打包文件夹的大小约30MB,约为原来的一半左右。将文件夹压缩(RAR,最好),大小为8.8M,已经在可以接受的范围了[捂脸]。
图12. 精简后的文件大小
总结一下,本文中我们主要学会了一种简单的设置程序图标的方法和使用windeployqt打包程序的方法。Qt打包的程序有些体积过大,因此基于Dependency Walker软件研究了精简体积的方法。
限于小白我的水平有限(总感觉越来越难了[捂脸]),本文有任何不对之处或者有更好的方法,请大家多多关注评论[赞]。
—————往期目录——————
从零开始学Qt – 04:编写一个Hello World程序
从零开始学Qt - 03:探索Qt的安装目录结构
从零开始学Qt - 02. 手把手教你下载和安装Qt
从零开始学Qt - 01. 为什么学Qt
————————————————
立即咨询: 13716188458 / 18588225959,助您抢占市场先机。项目经理在线