windows下 Qt 静态编译

windows Qt 静态编译 

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

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

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

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

静态编译?

或许有两个层次:

·            编译出的程序不依赖 QtCore4.dllQtGui4.dll Qt 的静态库

·            编译出的程序不依赖 msvcr90.dllmsvcp90.dll CC++ 的运行库

编译Qt

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

configure

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

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

*  -shared ............ Create and use shared Qt libraries.
    -static ............ Create and use static Qt libraries.

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

这样一来,我们将得到

·            QtCore.lib QtCored.lib 等静态库

而不是

·            QtCore4.lib QtCored4.lib 等导入库

·            QtCore4.dll QtCored4.dll 等动态库

去除CC++运行库的依赖

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

但是,它们仍依赖 CC++ 的运行库。如果还想去除该依赖,需要在静态编译Qt之前手动修改

%QTDIR%/mkspecs/win32-msvc2005/qmake.conf

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

cl /?

得到

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

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

qmake -r

如何加快编译

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

·            禁止编译不需要的模块,比如 Qt3SupportQtWebkit,等

·                  运行 configure -h 可以得到详细的参数列表

·            禁止编译例子和demo,当系统中存在多套Qt时,编译例子确实不太需要,但 configure 没有相应的参数来禁止 demo 例子

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

·                  可以直接移除 demoes examples 目录(移除肯定就不会编译了,但个人不喜欢这个)

·                  可以修改 Qt 根目录下的 projects.pro 文件

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

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

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

·            运行完 configure 后,我们也可以通过运行

make sub-src

而不是

make

来避免编译非必须的东西

·            编译完成后,运行

make confclean

来清理编译过程中的中间产物

插件问题

·            动态编译时,插件似乎困扰不少人,经常有人抱怨,程序发布后,jpeg图片无法显示?中文显示乱码等等?

·                  解决方法很简单,发布时带上插件就行了(注意路径)

·            当采用静态编译后,插件问题更严重了,为什么呢?插件都成静态库了,无法动态加载了(或许已不能被称为插件了)

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

·                  看例子中 tools/plugandpaint 例子,使用的静态插件

常用插件

·            图片插件 qgif qjpeg qico

·            数据库 qsqlite

·            东亚语言 qcncodecs

·            phonon 后端支持插件

·            QStyle 插件

·            ...

静态编译时插件的使用(比如,jpeggb2312的支持)

·            cpp 文件(main.cpp)内添加语句

 

#include<QtPlugin>
Q_IMPORT_PLUGIN(qjpeg)
Q_IMPORT_PLUGIN(qcncodecs)

·            pro 文件内添加

 

QTPLUGIN += qjpeg qcncodecs

对与Mingw

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

再就是,修改

%QTDIR%/mkspecs/win32-msvc2005/qmake.conf

QMAKE_LFLAGS 添加 -static 选项

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

·            mingwm10.dll

·            libgcc_s_dw2-1.dll

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

LFLAGS =

LFLAGS = -static-libgcc

这个我没试,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/

来自: http://hi.baidu.com/cyclone/blog/item/25b262d9337a172310df9b78.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值