转一篇比较详细的vc编译qt的文

来源:互联网 发布:边际效应递减规律知乎 编辑:程序博客网 时间:2024/05/28 15:06

1. /MT, /MTd, /MD, /MDd区别及如何在编译Qt SDK时配置这些选项

编译Qt SDK有动态和静态之分。
同时我们还要将debug与release也区分开来。
我们看的VS2005里面有下面的runtime Library,这里就有4中/MT(静态release), /MTd(静态debug), /MD(动态release), /MDd(动态debug)


这里需要考虑2个问题

<1.1>链接库时静态(static)和动态(dynamic)的区别?

所谓静态,就是将程序引用到的其他库中的文件都编译进exe,运行时不需要额外的dll。
动态呢,就是exe运行时必须在exe目录下有相应的dll。

举个例子吧,大家看下图:


<1.2>生成静态库和动态库的区别?

大家发现没有无论动态链接还是静态链接都有对应的lib。
其实动态链接库对应的lib和静态链接库对应的lib不一样。

静态库对应的lib文件叫做静态库,动态库对应的lib文件叫做导入库。
静态库的lib包含了你编译库中.h和.cpp生成的所有二进制文件。
而动态库生成的lib仅包含一个导入表,你必须在相应的dll中才能找到实际的二进制执行代码。

所以使用静态库的时候,只需要.h和lib

而使用动态库的时候必须分为2中,编译时和运行时。
编译一个exe,该exe依赖某个dll,那么在编译时需要.h及.lib(导入表)。
但是在运行时候必须加上dll,不然无法运行。

2. 编译Qt SDK

Qt默认是动态编译的
所以我们编译Qt SDK需要指定, 动态(shared)还是静态(static),debug还是release,平台类型,需要编译的模块等信息。。。。。

下面是我使用的编译选项:
configure -debug-and-release -platform win32-msvc2005 -opensource -fast -nomake examples -nomake demos -no-webkit 
含义
-debug-and-release包含debug和release的版本
-shared默认的,所以我没加
-platform win32-msvc2005平台我选选择vs2005使用的编译器
-opensource编译的是开源版本
-fast只对需要的库生成makefile
-nomake examples不编译examples
-nomake demos不编译demos
-no-webkit 不编译webkit,因为webkit基本用不到,而且很费时间
具体可以到:http://qt-project.org/doc/qt-4.8/configure-options.html查看




////////////////////////////////////////////////////

转载文章一

转自:http://www.pin5i.com/showtopic-qt-vs2005-vs2008-mingw-static-compilation.html

 

  编译准备  

下载NOKIA网站上的QT SDK,解压或安装到相关目录。

本文以QT 4.6.2为例,下载地址:http://get.qt.nokia.com/qt/source/qt-win-opensource-4.6.2-vs2008.exe
或者直接下载源码:http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.2.zip

下载后安装好的目录结构为(假设安装到D:\QT):
├─share
├─lib
├─bin
├─mingw
└─qt
    ├─translations(QT语言文件目录)
    ├─tools(QT相关工具源码目录)
    ├─src(源代码目录)
    ├─qmake(qmake源代码目录)
    ├─plugins(图形,数据库等插件目录)
    ├─mkspecs(平台配置文件)
    ├─lib(库文件)
    ├─include(头文件)
    ├─examples(示例程序)
    ├─doc(文档)
    ├─demos(演示程序)
    ├─config.tests
    ├─bin(命令行工具)
    └─qtc-debugging-helper

configure配置工具在qt目录,以下假设QTDIR=D:\QT\SDK\qt,编译前最好清空 lib,demos,examples,docs四个目录,配置完成后在这几个目录下放一个空的Makefile文件,避免make时报错。

  VS2005动态编译  

1.设置VS2005的环境变量
2.设置目标平台
set QMAKESPEC=win32-msvc2005
3.进入 QTDIR目录运行配置,生成Makefile文件
configure -platform win32-msvc2005 -release -opensource -shared -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista
4. 运行nmake /I /K(附带/I /K 选项可以避免出现错误时编译自动终止,用于跳过错误继续编译其它文件)

经过这样编译的Qt库不依赖mingwm10.dll,libgcc_s_dw2-1.dll,但依赖Qt库的Dll文件和微软的CRT运行时库,使用此Qt库编译Windows平台下的程序,发布时需带上用到的Qt链接库Dll文件和微软的CRT运行时库Dll文件。

  VS2005静态编译  

(VS2008 编译同理,启动相应的命令行,设置相应的目标平台,修改相应的配置文件)
1.设置VS2005的环境变量
2.设置目标平台
set QMAKESPEC=win32-msvc2005
3.修改mkspecs/win32-msvc2005目录下的配置文件 qmake.conf
将下面两行:
QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CFLAGS_DEBUG      = -Zi -MDd
修改为:
QMAKE_CFLAGS_RELEASE    = -O2 -MT
QMAKE_CFLAGS_DEBUG      = -Zi -MTd
(D是指dynamic,T是指static,d是指debug)
4.进入QTDIR目录,运行配置,生成 Makefile文件
set QMAKESPEC=win32-msvc2005
configure -platform win32-msvc2005 -release -no-exceptions -opensource -static -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista
5.运行运行nmake /I /K

经过这样编译的Qt库不依赖于任何Dll文件(如微软的CRT运行时库),使用此Qt库编译Windows平台下的程序发布时不需要附带任何额外的 Dll文件。

  MinGW静态编译  

1.设置MinGW的环境变量
2.设置目标平台
set QMAKESPEC=win32-g++
3.修改 mkspecs/win32-g++目录下的配置文件qmake.conf
将下面一行:
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
修改为:
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
然后将下面一行:
QMAKE_LFLAGS_DLL        = -shared
修改为:
QMAKE_LFLAGS_DLL        = -static
4.QTDIR目录,运行配置,生成Makefile文件
set QMAKESPEC=win32-g++
configure -platform win32-g++ -release -no-exceptions -opensource -static -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista
5.运行运行mingw32-make -i -k(-i -k选项的含义与上面nmake的相同)

经过这样编译的Qt库,不依赖任何Dll文件(如mingwm10.dll,libgcc_s_dw2-1.dll),使用此Qt库编译的 Windows平台下的程序发布时不需要附带任何额外的Dll文件。

  编译事项说明  

编译完成后可以删除bin目录中所有不是当前编译日期的文件。

建议编译前移除examples和demos文件夹的所有文件,避免重编译这两个文件夹,加快编译速度。

另外,编译命令请根据自己的实际情况配置,上面我的配置是(以VS2005静态编译为例):
-platform win32-msvc2005 目标平台
-release 关闭调试信息
-no-exceptions 除去异常支持
-opensource 开源版
-static 创建静态库
-fast 快速配置,只生成Qt库文件及子目录的Makefile文件,其它的Makefile文件后面再使用qmake生成
-qt-sql-sqlite SQLite驱动支持
-plugin-sql-sqlite  SQLite链接插件支持
-no-qt3support  不编译Qt3兼容库
-qt-zlib zlib库
-qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg 图形格式插件库
-no-webkit 不编译webkit,此选项可极大加快编译速度,需要使用WebKit的可以删除此选项
-qt-style-windowsxp -qt-style-windowsvista 支持XP和Vista主题样式

注意:使用静态编译的程序通常较大,建议发布前使用UPX压缩,一般可以减少至少50%的大小。

//////////////////////////////////////////////////////////////////////////////////////////////

转载文章2

具体步骤: 
1. 下载 qt-everywhere-opensource-src-4.6.2.tar.gz 源码包,解压到:D:\Qt\4.6.2\ 
2. 配置环境变量,打开windows的环境变量. 
   Path项加入 D:\Qt\4.6.2\bin; (由于下面配置了QTDIR所以这块也可以写成 %QTDIR%\bin) 
   新建QMAKESPEC项加入 win32-msvc2005; (使用vs2005来编译库) 
   新建QTDIR项加入 D:\Qt\4.6.2 
3. 拿到vsvars32.bat 
   路径:%VS安装目录%\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat 
   找到后拷出来一份放到桌面上面,打开cmd把vsvars32拖进去,运行。然后输入nmake,如果能找到说明配置成功。 
4. 编译Qt4 Win版 
   经过您上面的配置,就可以开始编译Qt4了。在上面打开的cmd命令行下,cd到您安装Qt4的目录。 
   键入 configure -debug-and-release -platform win32-msvc2005 -opensource -fast -nomake examples -nomake demos -no-webkit 
   然后选择 openSource 的版本; 
   选Y,然后输入qmake就会开始生成整个Qt的工程。 
   最后会停下来,然后输入 nmake 就会开始编译。 
5. 生成VS2005工程 
   打开cmd,把vsvars32.bat拖进来,回车。进入你保存main.cpp的目录。(保存的地方不要有中文) 
   运行 qmake -project 
   运行 qmake (会生成.pro和两个makefile。一个debug 一个release) 
   运行 nmake (会编译debug版本默认,如果想编译release需要 /f makefile.release) 
   然后运行看看成果.呵呵. 
   ---------------------------------- 
   qmake -project -t vcapp 回车 
   qmake 
   通过这个步骤可以生成一个VC工程。 
6. VS2005必须安装qt-vs-addin-1.1.3插件才可以建立Qt的项目工程; 
7. 在VS2005的菜单Qt->Qt Options添加Vesion name:Qt4.6.2,Path:D:\Qt\4.6.2; 
7. visual assist中加入Qt库 
   打开visual assist设置面板,选择project- >C/C++ Directories 将Platform选择为Custom,然后分别在stable include files 和src files中加入qt的include和src目录。重启vs后,assist即可以包含QT库。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
转载文章3

  • 编译出的程序不依赖 msvcr90.dll、msvcp90.dll 等 C、C++ 的运行库
编译Qt
configure
* -shared ............ Create and use shared Qt libraries.
-static ............ Create and use static Qt libraries.
去除C、C++运行库的依赖
%QTDIR%/mkspecs/win32-msvc2005/qmake.conf
cl /?
qmake -r
如何加快编译
  • 运行 configure -h 可以得到详细的参数列表
  • 禁止编译例子和demo,当系统中存在多套Qt时,编译例子确实不太需要,但 configure 没有相应的参数来禁止 demo 和 例子
  • 可以直接移除 demoes 和 examples 目录(移除肯定就不会编译了,但个人不喜欢这个)
  • 可以修改 Qt 根目录下的 projects.pro 文件
  • 运行完 configure 后,我们也可以通过运行
make sub-src
  • 而不是
make
  • 来避免编译非必须的东西
  • 编译完成后,运行
make confclean
  • 来清理编译过程中的中间产物
插件问题
  • 动态编译时,插件似乎困扰不少人,经常有人抱怨,程序发布后,jpeg图片无法显示?中文显示乱码等等?
  • 解决方法很简单,发布时带上插件就行了(注意路径)
  • 当采用静态编译后,插件问题更严重了,为什么呢?插件都成静态库了,无法动态加载了(或许已不能被称为插件了)
  • 看例子中 tools/plugandpaint 例子,使用的静态插件
常用插件
  • 图片插件 qgif qjpeg qico 等
  • 数据库 qsqlite 等
  • 东亚语言 qcncodecs 等
  • phonon 后端支持插件
  • QStyle 插件
  • ...
  • 在 cpp 文件(main.cpp)内添加语句
#include<QtPlugin>
Q_IMPORT_PLUGIN(qjpeg)
Q_IMPORT_PLUGIN(qcncodecs)
  • pro 文件内添加
QTPLUGIN += qjpeg qcncodecs
对与Mingw
%QTDIR%/mkspecs/win32-msvc2005/qmake.conf
  • mingwm10.dll
  • libgcc_s_dw2-1.dll
LFLAGS =
LFLAGS = -static-libgcc
  • 异常
  • 线程
参考

似乎一直没有静态编译Qt的需求:一不在没有管理员权限的机器上使用,二不制作绿色软件,三...。动态编译工作得很好,再配合 nsis 制作一个安装包,有什么必要静态编译呢?

但论坛中似乎总是不停有人问到静态编译的问题,似乎遇到问题的人挺多,用百度或google搜索"Qt静态编译"也能搜到相当多的内容。

正好利用周末时间,自己尝试编译一下,顺便整理一下,看看到底会发生什么(尽管以后还是用动态编译)。

没特殊说明的话,以下讨论的是 MSVC2008 下的情况:

静态编译?

或许有两个层次:

  • 编译出的程序不依赖 QtCore4.dll、QtGui4.dll 等 Qt 的静态库

Qt 默认是动态编译的,下载Qt的源码,解压,而后运行(当系统中有多套编译环境时,需要通过platform参数指定所用编译环境 -platform win32-msvc)

然后运行 make 就进入漫长的等待了,结束后Qt编译就完成了。

运行 configure -h 可以得到详细的帮助信息,包括默认启用哪些参数等。

如果我们要静态编译,只需要在 configure 后添加 -static 就行了。当然根据个人喜好,你可能会添加更多的参数,比如 -no-qt3support 禁用 qt3 支持模块等,不过这与静态编译没有直接关系了。

这样一来,我们将得到

  • QtCore.lib QtCored.lib 等静态库

而不是

 

  • QtCore4.lib QtCored4.lib 等导入库

  • QtCore4.dll QtCored4.dll 等动态库

    通过 configure 的 -static 选项,我们可以编译出 Qt 的静态库,如果只是不想发布程序时发布Qt的动态库,这个已经完成了。

    但是,它们仍依赖 C、C++ 的运行库。如果还想去除该依赖,需要手动修改

    将 QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分别修改为 -MT 和 -MTd 即可。 这4个参数的含义很容易通过

    得到

    另外,还可以讲 CONFIG 中的 embed_manifest_dll embed_manifest_exe 去掉(也可以不去掉)。

    注意:对 qmake.conf 的修改最好放在运行 configure 之前,不然的话,修改后还需要手动运行(原因你知道的 ;-) )

    编译 Qt,应该是一个比较费时费力费空间的(磁盘中没有15G的空闲空间,都不敢编译Qt4.7)。编译时有选择地去掉一些东西是比较合适的

    • 禁止编译不需要的模块,比如 Qt3Support,QtWebkit,等

      • 非windows系统下 configure 似乎支持  -nomake examples -nomake demos

        • 方法一 注释掉 SUBDIRS += demos 这样的行

        • 方法二 直接修改 QT_BUILD_PARTS = libs tools examples demos docs translations

      • 可以修改 Qt 根目录下的 .qmake.cache 中的 QT_BUILD_PARTS

      • 看 QtPlugin 的Manual,有关于静态插件的使用介绍

    静态编译时插件的使用(比如,jpeg和gb2312的支持):

     

     

    采用 Mingw 静态编译Qt的步骤和上面基本一样(给configure传递 -static参数)。

    再就是,修改

    为 QMAKE_LFLAGS 添加 -static 选项

    但是 MinGW 编译的程序会依赖下面的动态库

    对后libgcc这个库,似乎还好办,一种说法是修改 <QTDIR>/qmake/Makefile.win32-* 中的

    这个我没试,Qt4.6.3中 LFLAGS 默认确实为空,但Qt4.7中默认已经添加了该选项

    对与 mingwm10 这个动态库,似乎比较难办。因为它似乎和

    有关。

    • http://qtnode.net/wiki?title=Building_static

    • http://qtnode.net/wiki/Qt4_with_Visual_Studio_and_static_C_runtime

    • http://www.formortals.com/how-to-statically-link-qt-4/

    • http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/

    • http://www.qtcentre.org/threads/29489-Removing-dependencies-for-mingwm10.dll-and-libgcc_s_dw2-1.dll-static-linking

    • http://blog.lugru.com/2010/04/static-qt-compilation-and-mingwm10-dll-mingw-confusion/