您的位置:首页 > 编程语言 > Qt开发

减少Qt编译时间暨简单Qt裁剪

2010-09-28 19:29 267 查看
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。

原文链接:减少Qt编译时间暨简单Qt裁剪
编译一次Qt
要耗费太多的时间,常常是越着急用它,编起来越慢。其实通过很简单的几招可以帮你节省编译的时间。下面就一一道来:
第一招,编译之前确定哪些功能是不必要的,对编译树进行简单裁剪。

比如最常见的,像demos
, examples
,虽然很有参考价值,但完全可以放在后面用到的时候再单独编译小工程,这样可以节省不少时间。经过实践,最简单的方法是修改configure
文件,在该文件中有个指定编译目录的字段:
QT_DEFAULT_BUILD_PARTS=”libs tools examples demos docs translations”

可以把examples
、demos
和docs
从这里去掉,但要注意,别的可不能随便去掉。
在比较新的Qt版本里提供了 “-nomake”
的configure参数, 可以实现相同的功能。 如”configure -nomake demos -nomake examples”
就可以把examples和demos从编译过程中去掉。 不过这个选项要在比较新的Qt版本里才能很好的工作,
而且并不是所有的Qt支持的平台都支持这个选项了。
如果在后面的使用中发现有些小工程需要编译了,可以采用一般编译Qt
程序的方法,即用Qt
安装目录bin
下的qmake
来生成Makefile
,同样可以编译和测试例子代码,一点也不影响使用。
第二招,裁剪
Qt

模块。

Qt
从4
版本开始采用了模块化的形式,将独立的功能封装在独立的库里,所以可以很简单的去掉一些不需要的库,这样也能节省编译时间和对硬盘空间的占用。 Qt
的configure
配置提供了一些设置模块的方法,如它支持-no-svg
和-no-webkit
,通过configure
的时候加这些选项就可以去掉这部分支持。相应的还有很多小的功能可以通过configure
参数的形式配置,具体的参考configure –help
的输出。在查看configure
帮助的时候特别要注意加*
号的内容,也就是Qt
默认的configure
选项,有的时候默认选项可不一定是讨人喜欢的哦。
Qt
桌面版本默认会尽量多的编译feature
进去,这样有一定的好处,就是用户可以用到所有的Qt
功能,但坏处也很明显,那就是编译出来的Qt
超级大,特别是编译debug
版本,基本上要占1
到2G
的空间,所以个人感觉研究一下configure
的选项还是很有必要的。另外, 默认状况下有些插件是不会编译的,比如数据库插件,往往需要用户自己根据需要编译,这一点也要注意。
第三招,针对嵌入式版本的配置。

Qt
的嵌入式版本本身就支持feature
裁剪,我们可以充分利用这一特性让Qt
库尽量变小。具体的做法是要做一个自己的qconfig-[myconfig].h
特性文件,该文件中定义你要去掉Qt
中的哪些feature
。在configure
的时候加“-qconfig myconfig”
选项, Qt
就会根据你给出的配置文件来编译,以达到裁剪的目的。这里要强调一下,这种裁剪方式只适用于嵌入式版本。这里的myconfig
可以用任何你喜欢的名字来代替。
在qt
的代码中已经给出了一些qconfig
头文件的例子,默认编译采用full config
也就是
不裁剪任何feature
。所有Qt
预定义好的qconfig
文件,可以在src/corelib/global/
下找到,包括qconfig-minimal.h, qconfig-small.h, qconfig.medium.h,qconfig-large.h
和qconfig-dist.h
,也就是从裁剪量由多到少都有据可依。如果要添加你自己的配置文件,要在src/corelib/global
下建立一个形如qconfig-xxx.h
的文件,这个xxx
也就是你要在configure
的时候传入的qconfig
参数。笔者测试使用的Qt
版本是4.4.1
,这个版本的build system
有个小毛病,就是如果你指定的qconfig
参数实际上没有qconfig-xxx.h
文件对应, build
不会停止,它只会给出一个不起眼的提示,编译过程会继续, 这一点挺让人费解的。而且这种情况下Qt
编译使用的配置基本上和fullconfig
相同,鉴于它的让人迷惑的举动,个人觉得有必要提醒大家一下,使用自定义qconfig
的时候一定要确定配置文件放对了位置,而且qconfig
参数给的正确。
一般我们的建议是在桌面上测试阶段编译一个full
的版本,再根据你的项目使用Qt feature
的情况总结哪些可去掉的feature
。 feature
之间有千丝万缕的依赖关系,这个问题也是困扰很多人的难点所在。具体的依赖可以查阅src/corelib/global/qfeatures.h
和src/corelib/global/qfeatures.txt
(描述依赖关系的文档)。另外,Qt
里还提供了一个可视化的配置依赖的工具,叫做qconfig
,在QTDIR/tools/qconfig
目录。该工具需要基于Qt
桌面版本编译。如在我的linux
系统下可以用下面的命令来编译:
$ cd qt-embedded-linux-commercial-4.4.1/tools/qconfig

$ /usr/local/Trolltech/Qt-4.4.3/bin/qmake

$ make

编译成功后运行./qconfig
,初始要打开qfeatures.txt. Qconfig
读取该文件生成一个树状图,该图很清楚的显示出feature
之间的依赖关系。如下图所示,如果你去掉了LINEEDIT
这个feature
,用到该控件的combobox
也就不能继续使用了。有了这个工具裁剪Qt
变得简洁直观,方便了很多。



选定了你要去掉的feature
后点击菜单File->Save As..
会弹出保存文件的页面,文件名字应该定义成qconfig-xxx.h
的形式,这样你在configure
的时候就可以传入相应的qconfig
参数了。你还可以通过选择File->Open
打开现有的qconfig-xxx.h
文件,通过修改已经有的文件更快的编辑配置。
根据笔者测试,未经裁剪的qte4.4.1
编译出来为:
libQtCore.so
是2.6M

libQtGui.so
是9.5M

如果用small
来编译,就能缩小为:
libQtCore.so
是2.0M

libQtGui.so
是5.7M

差异还是比较明显的。
顺便提一句,笔者使用的版本minimal
配置不幸build
不成功,看来Qt
发布版的测试不够全面,囧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: