1. /MT, /MTd, /MD, /MDd区别及如何在编译Qt SDK时配置这些选项
<1.1>链接库时静态(static)和动态(dynamic)的区别?
<1.2>生成静态库和动态库的区别?
2. 编译Qt SDK
转载文章一
转载文章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++ 的运行库
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 后,我们也可以通过运行
- 而不是
- 来避免编译非必须的东西
- 编译完成后,运行
- 来清理编译过程中的中间产物
- 动态编译时,插件似乎困扰不少人,经常有人抱怨,程序发布后,jpeg图片无法显示?中文显示乱码等等?
- 解决方法很简单,发布时带上插件就行了(注意路径)
- 当采用静态编译后,插件问题更严重了,为什么呢?插件都成静态库了,无法动态加载了(或许已不能被称为插件了)
- 看例子中 tools/plugandpaint 例子,使用的静态插件
- 图片插件 qgif qjpeg qico 等
- 数据库 qsqlite 等
- 东亚语言 qcncodecs 等
- phonon 后端支持插件
- QStyle 插件
- ...
- 在 cpp 文件(main.cpp)内添加语句
Q_IMPORT_PLUGIN(qjpeg)
Q_IMPORT_PLUGIN(qcncodecs)
- pro 文件内添加
对与Mingw
%QTDIR%/mkspecs/win32-msvc2005/qmake.conf
- mingwm10.dll
- libgcc_s_dw2-1.dll
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/Qt4_with_Visual_Studio_and_static_C_runtime
-
http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/
-
http://blog.lugru.com/2010/04/static-qt-compilation-and-mingwm10-dll-mingw-confusion/
-