Qt4.8.6静态编译

这几天用Qt写了个小工具,结果编译出来的EXE 35K,但是所需的运行库DLL竟然要14M,吓尿了,赶紧找办法解决,原来静态编译(还是静态链接?)出来的EXE可以变小很多,于是就有了下面的实验过程,大家参考参考就行了,多看几篇同时参考,总会成功的。

一、准备工作

*我的环境是Win7 x64 I3 3220 8G内存。
下载 qt-everywhere-opensource-src-4.8.6.zip,解压,我这里是F:\Qt\Qt_everywhere-src_4.8.6,下称“源码目录”

官网下载:http://download.qt-project.org/official_releases/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.zip
下载 Qt libraries 4.8.6 for Windows (MinGW 4.8.2, 328 MB) 安装包,安装在F:\Qt\Qt_4.8.6_MinGW,下称“安装目录”
官网下载:http://download.qt-project.org/official_releases/qt/4.8/4.8.6/qt-opensource-windows-x86-mingw482-4.8.6-1.exe
地址也可以在官网找到:http://qt-project.org/downloads

安装时,留意提示MinGW需要另外下载(如果你有,当然不用另下了),自行下载并解压在F:\Qt\Qt_4.8.6_MinGW\mingw32,下称“MinGW目录”

下载地址:http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/4.8.2/threads-posix/dwarf/i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z/download
 

二、改参数(此部分抄袭自 参考文章一,有修改)

打开F:\Qt\Qt_everywhere-src_4.8.6\mkspecs\win32-g++\qmake.conf
在60行附近,找到QMAKE_LFLAGS = ,在后面加上 -static
再往下几行找到 QMAKE_LFLAGS_DLL = -shared,后面的 -shared 改为 -static
(如果不做这个修改,生成的执行文件要依赖libgcc_s_dw2-1.dll,libstdc++-6.dll,libwinpthread-1.dll)

 

三、准备环境变量

开始菜单——所有程序——Qt by Digia v4.8.6 (MinGW 4.8.2 OpenSource)——Qt 4.8.6 Command Prompt,出现命令行窗口:

Setting up a MinGW/Qt only environment…
– QTDIR set to F:\Qt\Qt_4.8.6_MinGW
– PATH set to F:\Qt\Qt_4.8.6_MinGW\bin
– Adding F:\Qt\Qt_4.8.6_MinGW\mingw32\bin to PATH
– Adding C:\Windows\System32 to PATH
– QMAKESPEC set to win32-g++-4.6

输入set QMAKESPEC=win32-g++ ,然后cd切换到F:\Qt\Qt_everywhere-src_4.8.6,也就是源码目录,注意这个命令行窗口会一直用到最后,不要关掉了。

 

四、配置configure

在命令行输入:

configure -confirm-license -opensource -prefix “F:\Qt\Qt_4.8.6_static” -debug-and-release -static -platform win32-g++ -nomake demos -nomake examples -nomake tests -fast -mp

相关参数说明在下面,如果执行后有提示类似如下的错误:

Could not find mkspecs for your QMAKESPEC(win32-g++) after trying:
F:/Qt/Qt_4.8.6_static\mkspecs

就把源码目录下的mkspecs文件夹复制到 F:\Qt\Qt_4.8.6_static,再次输入上面的configure命令。
经过一大轮的Reading之后,没有错误,提示如下的话,就完成配置了。

Qt is now configured for building. Just run mingw32-make.
To reconfigure, run mingw32-make confclean and configure.

使用到的选项说明:
-confirm-license -opensource 选择开源协议并确认
-prefix “F:\Qt\Qt_4.8.6_static” 指定编译后安装到目录”F:\Qt\Qt_4.8.6_static”
-debug-and-release 编译debug和release版
-static 编译成静态库
-platform win32-g++ 使用mingw编译
-nomake demos -nomake examples -nomake tests 不编译这些不需要的东西
-fast 快速编译
-mp 使用多核编译优化(没什么感觉)

 

五、编译Qt源码

命令行,在源码目录,执行命令 mingw32-make,就开始编译了,差不多要等2个小时(Win7 x64, I3 3220, 8G) 完成编译。
编译完成后,执行命令mingw32-make install,可以看到是一大堆的复制命令,整个过程也要耗时9分钟左右。

 

六、*如有必要,修改Qt安装路径(此段大部分抄袭自 参考文章三,有修改)

最初编译时设定的安装路径是F:\Qt\Qt_4.8.6_static,如果想将它复制到其他盘符,并且改名,例如:C:\Qt\4.8.6_MinGW。这样一来会有问题吗?
是的,会有问题,因为Qt有绝对路径依赖症。改名后C:\Qt\4.8.6_MinGW\bin\的exe执行程序都会出问题,要么程序打不开,要么多国语言发生异常。

用记事本打开C:\Qt\4.8.6_MinGW\bin\qmake.xe,查找关键字“qt_prfxpath”,出现:
qt_prfxpath=F:\Qt\Qt_4.8.6_static,可以看出这是原始的安装路径。
我们不可以手动去修改qmake.exe里面的内容,真正有效的解决方法是在C:\Qt\4.8.6_MinGW\bin\路径下创建一个qt.conf文件,内容为:

[paths]
Prefix = C:/Qt/4.8.6_MinGW

请注意:qt.conf文件必须是ANSI格式,并且Prefix的斜杠风格采取的是Linux的,而非Windows,否则会失效。或者使用”Prefix = .. “,如此一来,任意路径有效。

 

七、投入使用

在Qt Creator 3.1.1 里打开工具——选项——构建和运行。
在Qt Version页面,添加,版本名称随便打,如Qt_4.8.6_static_MinGW,qmake路径选择你的安装目录\bin\qmake.exe,如图。

在构建套件页面,添加一个,名称随便改,如Qt_4.8.6_static,编译器,调试器用回你之前安装的动态编译版的MinGW目录,Qt版本就用上面添加的那个Qt_4.8.6_static_MinGW,如图。

然后回到项目页面,添加一个构建套件,剩下的就是选择编译Debug还是Release,然后Ctrl+R了,不细表。

 

八、效果:

原来用Qt动态编译生成的Release版本exe只有35KB,但运行所需的6个DLL总共14.6MB,RAR打包后共4.96MB。
现在用Qt静态编译生成的Release版本exe有11.1MB,没有任何DLL,用UPX3.91压缩后大小为4.07MB,果然不错。

九、参考文章:

http://thinkz.lofter.com/post/1721fd_75df30 http://blog.csdn.net/markl22222/article/details/20734085 http://blog.csdn.net/libaineu2004/article/details/24620709