Qt在VS2008(VS2010)下的
静态编译 1.
安装VS和qt-win-opensource-4.7.4-vs2008.exe 2. 进入
C:\Qt\4.7.4\mkspecs\win32-msvc2008 目录(如果是2010就进入
win32-msvc2010目录),修改qmake.conf文件,把下面三行QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd
修改为
QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd


3.
打开Qt的命令提示符:Qt 4.7.4 Command Prompt
3.1.
生成静态编译的配置首先查看它的
configure参数,方法很简单,输入命令configure okOk
是啥意思呢?Ok其实不是configure的参数,这里也可以不用“ok”,你写“ddddd”或者“fafasdfasdfwe”,都可以,总之输入一个错误的参数后命令提示符会自动把qt的参数列出来。我把所有的参数都截图并保存在文件夹中,分别命名为configure参数0~8.jpg。先来看下第0张截图和第1张截图,如下: configure
参数0.jpg
这是一组完整的参数列表,中括号
[ ]里面的是直接可以写出来作为configure的命令的,尖角符号< >里是需要填的参数。具体各个命令都是什么意思,以及应该写哪些参数在后续截图上都有显示。configure
参数1.jpg
这张图是总的说明,即一个命令是由一个
buildkey(命令)和相应的key(参数)组成的。上图还说,星号*标示的命令是默认命令;加号+标示的命令是只有你明确写出来才会被执行的( ? )。注意:实际在命令行里写参数的时候除了短横线“
-”以外,不需要加任何符号。配置参数可以根据个人情况进行配置,一般都没啥大
问题,一组可行的
configure命令是:configure -debug-and-release -opensource -static -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -script -scripttools -mp -no-webkit -nomake docs -nomake examples -nomake demos
注意,最后三个命令(
nomake)是我在网上看到的,可以用,但是命令提示符里面没有写。这里是网上看到的一组参数:
configure -platform win32-msvc2008 -debug-and-release -static -fast -qt-sql-sqlite -no-webkit
我使用这组参数后发现编译过程竟然超过两个小时,而且生成的文件巨大(
25G左右),然后我查看Qt安装目录,发现里面竟然多生成了许多demo文件,我打开Qt Assistant,发现帮助文档已经被改版了,变得很挫!用起来没有原先的那个好。虽然我用这个25G的Qt完成了我发布的第一个程序的静态编译,但是我还是强烈建议不要使用这么简单的命令,一些不必要的东西能不要就不要吧。其中最后一句
-mp比较重要,表示在VS框架上写QT程序时,编译过程中使用多处理器。
另外网上查看别人的
configure参数里通常有这样一句:-platform win32-msvc2010
这个命令是设置现在使用的操作系统和编译器,

从截图中可以看到
-platform采用的默认参数是NAMESPACE,而在截图0中已经看到了,默认的NAMESPACE就是当前的操作系统和编译器名称:
3.2. 配置参数并开始编译静态
QT输入configure
命令(及参数)后按回车,则命令行提示你确认:
输入“
y”,然后编译器自动开始配置configure文件,这个过程大概需要6分钟,直到configure配置完毕,命令行再次提示你进行下一步操作:
输入命令:
nmake 回车即可。出去玩吧,一个半小时后回来看一眼电脑,差不多该编译完了。
4. 使用静态库
4.1 新建一个
QT4项目并静态编译它静态编译完了,最好重启一下电脑。然后安装
qt-vs-addin-1.1.9.exe安装完成后再次重启电脑。
然后打开
VS2008,新建一个Qt4 Application类:
比如我随便给了一个名字
dadadada,建立了如下所示的项目和解决方案:
注意,我没有对该项目进行任何操作,里面的文件都是自动生成的。
先修改编译模式为release

,然后右键项目名称dadadada
,选择“属性”,打开属性页,设置 C/C++ 代码生成的运行时库为MT,如下图:
然后编译该项目,得到
release模式下的exe文件,则该exe能够脱离Qt的dll文件来运行,你可以看一下,此exe文件有6M之大,就是因为它把Qt的lib文件里的程序代码已经写进去了。4.2 对已有
Qt项目进行静态编译假设我们已经有一个
Qt项目,且该项目在非静态Qt库下编译成功,那么我们要如何让该项目生成的exe文件脱离Qt的dll文件呢?很简单,上面已经建立了一个
dadadada的Qt项目,我们打开该项目,然后打开项目的属性页,在 链接器——输入 里面可以看到“附加依赖库”一项被写了很多东西,列出来如下:kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib ws2_32.lib ole32.lib user32.lib advapi32.lib qtmain.lib QtCore.lib QtGui.lib
这些就是
Qt静态编译所需要链接的lib文件。现在我们打开自己的
Qt程序,要想对它静态编译,只需要把项目和这些lib文件链接上就行了。方法是:打开项目,设置编译模式为
release,然后打开项目的属性页,在 链接器——输入——附加依赖库 里面把上面列的.lib名称复制进去;然后设置 C/C++代码生成的“运行时库”为“MT”,最后点击确定。下面就可以重新生成项目了,得到的
exe文件一般都在10M以上,表明静态库已经被链接进去了,此exe可以脱离dll文件运行。