环境:win7 32位 运行Qt5.6
所需外部软件:upx391w,Enigma virtual Box
以样例的形式说明如下:
1.利用QtCreator打开项目release生成项目可执行文件,注意这时生成的 *.exe文件是不能执行的,需要很多外部.dll文件,debug方式生成的文件有1.8M大。
2.提取ButtonTest5.exe运行所需要的dll文件。
如在F盘新建一个button文件夹,将ButtonTest5.exe复制到button文件夹中,启用Qt自带的windeployqt,将ButtonTest5.exe运行需要关联的dll文件拷贝到F 盘的button文件夹中,方法如下(参考:http://blog.csdn.net/syrchina/article/details/50663337):
在开始菜单找到Qt 5.6 for Desktop (MinGW 4.9.2 32 bit),运行打开Qt命令行,如下图。
针对F盘下的button文件夹,输入命令行: cd /d F:\button,切换到button文件夹目录下,
然后使用windeployqt工具, 再次输入命令行;windeployqt ButtonTest5.exe,就可以执行拷贝ButtonTest.exe文件关联的dll文件到button目录下面了,再看看F盘下的button文件夹,所需要的dll文件都已经拷贝进去了,如下图。
可以打开button文件夹,里面的ButtonTest5.exe可以运行了,此时button文件夹的总大小约39.7M,
3.使用Enigma virtual Box将ButtonTest5.exe文件及需要关联的dll文件生成单个可执行文件
运行提前安装好的Enigma virtual Box,"Input File Name"项选择可执行文件ButtonTest5.exe,“Enter Output File Name”选择待生成的单个可执行文件存放位置。点击“Add...”选择“Add Folder Recursive”添加dll文件所在的文件夹,选择F盘下的button文件夹。
点击"File Options"按钮,设置文件选项如上图,点击“OK”,最后一步是点击"Process",即可自动生成所需的单个可执行文件。生成的单个可执行文件有15.6M大小,如下图。
如果对生成的exe大小比较满意,到此就可以结束了。
如果是不想制作成单个可执行文件,而只是想以一个文件夹的方式(即:dll文件+ButtonTest.exe),显然,39M的大小是不能令人满意的,我们需要upx391w对dll文件进行无损压缩。
4.使用upx391w对dll文件进行压缩
upx391w(下载地址:http://upx.sourceforge.net/),在使用upx压缩前我们复制一份button文件夹,取名为button_1,方便对比。
下载upx391w,并将其解压到C盘下面(注:不知道为什么我放到F盘下没法正常使用,可能是系统命令行的原因吧!)
运行电脑的命令行,输入 cd C:\upx391w
再次输入命令行: upx.exe F:\button_1\*dll
这样就能将button_1下的所有dll文件进行压缩了,下图可以看出压缩后的文件比压缩前的文件小一倍,
当然你也可以如法炮制对iconengines等文件夹下的dll文件进行压缩,当所有dll文件都压缩完后,整个button_1文件夹的大小变为15.2M了,和上一步骤生成的单个可执行文件大小差不多了,比原来的39M小了一倍多。
但是,会发现不能对platforms文件夹中的dll文件进行压缩,否则button_1文件夹下的ButtonTest5.exe不能正常运行了,出现如下图示错误。所以在压缩dll文件时不要对platforms文件夹内的dll文件进行压缩,将platforms文件夹内的dll文件换回来就可以正常运行了。
这时你还可以仿照步骤3,用Enigma virtual Box将button_1文件夹内的ButtonTest5.exe进行制作成单个可执行文件。将生成的单个可执行文件命名为ButtonTest5_boxed11.exe,发现制作后的可执行文件大小为14.1M,相比较未压缩dll文件制作的单个可执行文件15.6M小了一些。
另外,网上也有不少文章(如:http://blog.csdn.net/gzshun/article/details/7495488)介绍hap-depends + ASpack + filepack方法生成可执行文件的,自己尝试用ASpack对button文件内的dll文件进行压缩,结果生成的.bak文件反而更大,如下图示,不知道是使用方法不对还是下载的软件有问题。尝试filepack封包结果也是不行,当然,很可能是自己使用不当的原因。
最后仍有很多不懂的东西,比如生成的单个可执行文件BottonTest5_boxed11.exe运行起来,通过Process Explorer软件查看内存占用比程序本身还大,可能是Qt本身的原因吧!