【抛砖引玉】Qt4.8.5 + Creator 2.8.0静态编译配置VS动态编译
第一部分 写在前面
作为一个Qter,我想很多人会和我一样,怎么才能编译输出一个可执行文件,这样不需要其他动态链接库就可以放在别人的同平台上的电脑上运行,也就是“静态编译”?带着这个疑问,我将在本文中介绍动态编译与静态编译生成的文件到底有什么差异。 我只是一个Qt的初学者,有的只是对Qt的爱好,文中语言若有不巧当之处,还请见谅。 文中提到的项目及工具下载地址:
第二部分 动态编译
当安装好Qt和Creator后,默认的就是动态编译方式。 在没有添加系统环境变量的情况下,到编译目录运行会出现如下错误。
我相信大家都知道这个问题,我在此提出这个问题的目的是向大家推荐一款软件,Dependency Walker。
树形图中黄色问号部分就是缺少的dll,复制dll到exe目录下再次检验是否缺少dll。如下图第一次缺少mingwm10.dll、QtCored4.dll和QtGuid4.dll,第二次打开缺少libgcc_s_dw2-1.dll,所以一共是拷了四个文件。
PS:不用管软件中间部分窗口中的提示。
现在就可以运行了。
第三部分 静态编译
第一步
文件目录C:\Qt\4.8.5\mkspecs\win32-g++\qmake.conf
改成
其他不要动,保存,关闭。
第二步运行Qt 4.8.5 Command Prompt
输入configure -platform win32-g++ -static -release -no-exceptions
回车 输入o
回车 输入y
回车 等待中(根据电脑配置的不同,时间有所差异,我的电脑用时12分钟)
输入mingw32-make sub-src 回车
等待中(根据电脑配置的不同,时间有所差异,我的电脑用时1.5小时)
到此为止,静态编译Release成功,像往常一样新建项目,编译运行。Release没有问题,但是Debug会出现以下问题。
新建项目,内容和原来一样。编译Release,用Dependency Walker查看。
以下是本次测试中动态编译Release和静态编译Release发布程序所需文件的对比。
第四部分 如何在动态编译模式单文件发布程序
提到这个问题,要说到两个软件,MoleBox和Enigma Virtual Box。 我是用的是MoleBoxPro 2.6.5。
和Enigma Virtual Box 6.80(这个是绿色单文件版,最新版7.10,但却是安装版)。
第五部分 如何回到动态编译
输入configure -platform win32-g++ -shared –release
回车 输入o
回车 输入y
回车 等待完成
到此为止,又回到动态编译模式,Release和Debug都是动态编译。
第六部分 静态编译VS动态编译
借助此次静态编译和动态编译配置间的切换,我做了以下测试。 测试环境: 操作系统:Windows 8.1专业版X64 处理器:Celeron(R) Dual-Core CPU T3000 @ 1.80GHz 1.80GHz 内存:3GB Qt:4.8.5 Creator:2.8.0 注:1、静态编译Debug出错,所以无数据。
2、无特殊注明情况下,文件大小单位为MB。
表1 动态编译和静态编译差异概览
由上表可知:
1、在不打包程序和压缩(加壳)情况下,发布程序文件总大小:静态Release < 动态Release << 动态Debug。
2、根据Release和Debug版本的区别,可以推断:静态Release < 静态Debug。
表2 分别使用MoleBox 和 Enigma Virtual Box打包程序及与UPX压缩程序的对比
由上表可知:
1、打包程序可以明显缩小文件体积(≥ 50%)。
2、MoleBox比Enigma Virtual Box略胜一筹。
3、单文件压缩时,UPX占据优势,Enigma Virtual Box把文件越压缩越大。
注:
1、测试过程中,运行MoleBox打包的程序有时会提示Out Of Memory的错误,说明MoleBox Pro 2.6.5不稳定。
2、想用UPX对MoleBox和Enigma Virtual Box打包的程序进行压缩时提示,CantPackException:section size problem的错误。
3、Enigma Virtual Box耗时比MoleBox长。
表3 四种方式发布程序最小文件大小
| | | | | | 静态Debug | | | | | | 静态Release | | | | | | 动态Debug | | | | | | 动态Release | | | | | | 由上表可知:
1、使用UPX对静态Release编译的程序压缩后,文件最小。
表4 MoleBox与Enigma Virtual Box的对比
| | | | 静态Debug | | | | 静态Release | | | | 动态Debug | | | | 动态Release | | | | 由上表可知:
1、MoleBox比Enigma Virtual Box略占优势。
注:
1、打开速度Enigma Virtual Box占优势,而且稳定性占优势。
表5 MoleBox 、Enigma Virtual Box、UPX用于压缩文件的对比
由上表可知:
1、UPX占绝对优势。
2、Enigma Virtual Box压缩后文件竟然比源文件还大。
图1 两种编译方式两种版本大比拼
图2 MoleBox VS Enigma Virtual Box
图3 压缩比
第七部分 结语
通过以上的图表对比可知:
的确,静态编译产生的文件比打包压缩后的动态编译文件还小。
而且静态编译是一步到位,不用再对文件进行打包和压缩。但是,请
看下图
显而易见,静态Release生成的目标程序是动态Debug的10多倍,是
动态Release的100多倍。
试想一下,一个程序是这样,那么10个、100个、1000个、10000个
……会是什么样子。
最后用一句话总结一下:
静态编译是给软件使用者的电脑节省空间;
动态编译是给软件开发者的电脑节省空间。
不言而喻,Qter应首选动态编译。
第八部分 写在最后
看到这里,你也许会问这个帖子不应该挂悬赏,应该是个教程贴。
至此,我也该说出我发此贴的目的了,正如标题中所说“抛砖引玉”。
①我希望有人可以给出更简单更方便的静态编译方法;
②我希望有人可以发现更好的打包程序软件和压缩软件;
③我最希望有人可以提出动态编译和静态编译自由切换的解决方案。
【Qter.org有您更精彩】
|