QT编译与配置(静态库与静态运行时库)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QT编译与配置(静态库与静态运行时库)
Qt是一个跨平台的应用程序程序框架,可以运行于Windows、Linux、Mac、S60等平台,自从其开源的授权协议由GPL变为LGPL后就变得流行起来。LGPL协议允许使用者开发私有程序而不开源,前提是Qt库必须以动态链接的方式加入程序。
打开Qt的下载页面,可以看到SDK和Library的下载链接。
SDK提供了完整的开发环境,而Library仅仅包含代码和编译出的库。这里的库都是动态链接的Release和Debug版库(相应的Configure参数为-debug-and-release -shared)。而如果需要静态库,就要自己编译了,如果不想自己编译,qtcn论坛上有不少已编译的静态库可以直接下载,地址
/bbs/read.php?tid=11800。
如果要自行编译,那么备好一份代码就够了,ftp:///qt/source/下有Qt的各个版本的代码下载
下面介绍一下Windows下的静态库编译过程
编译代码有基本的两步,configure和make,不过在这之前还要设置好编译环境。如果是VS,只要执行“Visual Studio 200X命令提示”就行了,如果是Mingw,需要把mingw下的bin目录加入到环境变量中。
这里推荐的configure命令是
configure [-release|-debug|-debug-and-release] -static -no-qt3support -no-webkit -platform
[win32-g++|win32-msvc2008|...]
要用Debug还是Release就看个人情况了,以上代码的release版编译结果大概有3G。禁用qt3support是因为这比较容易引起一些Bug,禁用webkit是因为这个东西占了代码总量的大概1/3,而基本上用不到。platform 参数指定了编译的配置文件,实际上就是qt\mkspecs目录下的各个配置。
然后就是make了。命令行下进入Qt目录,用VS的执行nmake,用Mingw的执行mingw32-make。上面的配置大概要编译2个小时。
关于静态运行时库
以上便是静态编译的经典过程,编译完成后可以开始写测试程序了。不过这里的静态仅仅指的是静态的Qt库,而C++运行时库仍然是动态的。所以尽管测试程序无需QtGui4.dll之类的库,却还需要Visual C++ 200X Redistributable Package、或者是libgcc_s_dw2-1.dll。
如果想要一个完全静态的编译,实现输出程序为一个单一的exe文件,就需要修改mkspecs,然后再configure。Mingw: 打开qt\mkspecs\win32-g++\qmake.conf,将QMAKE_LFLAGS那一行改为
QMAKE_LFLAGS = -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import
-Wl,-enable-runtime-pseudo-reloc
VS2008: 打开qt\mkspecs\win32-msvc2008\qmake.conf,设置QMAKE_CFLAGS_RELEASE和
QMAKE_CFLAGS_DEBUG,改为:
QMAKE_CFLAGS_RELEASE = -O2 –MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT –Zi //自己加(非原文)
QMAKE_CFLAGS_DEBUG = -Zi -MTd
如果使用VS编译应用程序,需要对项目属性进行更改,避免Qt和应用程序的运行时库不一致。
一些其它问题
如果用VS开发,需要安装一个Qt VS Integration。同时为了让VS支持代码补全,需要在“选项-VC++目录-包含文件”中加入Qt\include和Qt\include\QtCore
在使用Mingw进行编译时,默认生成的exe会需要mingwm10.dll,如果没有用到threads,那么在生成的makefile.release/.debug中,删除"-mthreads"参数,然后手动编译即可
Qt的某些版本存在Bug,具体表现为在默认配置下configure,然后make,接着程序报错退出。比如/browse/QTBUG-11249就描述了一个4.7.0下静态编译的问题,如果不禁用qt3support则报错。
一些其它版本同样可能存在问题。如果要对付大概只有翻网页或者是记住一些正确的版本和配置了。PS. Qt 4.6.2下,
configure -release -static -no-qt3support -no-webkit -platform win32-g++
configure -release -static -no-qt3support -no-webkit -platform win32-msvc2008
这两个配置都可以成功编译