• 9706阅读
  • 1回复

[原创]Qt在VS2008(VS2010)下的静态编译 [复制链接]

上一主题 下一主题
离线cccvvv
 

只看楼主 倒序阅读 楼主  发表于: 2012-04-01
关键词: 静态编译VS下

Qt在VS2008(VS2010)下的静态编译

1.  安装VSqt-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 ok
Ok是啥意思呢?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,发现帮助文档已经被改版了,变得很挫!用起来没有原先的那个好。虽然我用这个25GQt完成了我发布的第一个程序的静态编译,但是我还是强烈建议不要使用这么简单的命令,一些不必要的东西能不要就不要吧。
其中最后一句-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能够脱离Qtdll文件来运行,你可以看一下,此exe文件有6M之大,就是因为它把Qtlib文件里的程序代码已经写进去了。
4.2 对已有Qt项目进行静态编译
假设我们已经有一个Qt项目,且该项目在非静态Qt库下编译成功,那么我们要如何让该项目生成的exe文件脱离Qtdll文件呢?
很简单,上面已经建立了一个dadadadaQt项目,我们打开该项目,然后打开项目的属性页,在 链接器——输入 里面可以看到“附加依赖库”一项被写了很多东西,列出来如下:
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文件运行。


yu
离线cccvvv

只看该作者 1楼 发表于: 2012-04-01
如果在使用静态库过程中出现了“找到一个或者多个重定义的符号”这样的错误,请尝试:

右击项目,选择“属性”-“连接器”-“命令行”,在“附加选项”里面加入这句话:/force
yu
快速回复
限100 字节
 
上一个 下一个