本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。
原文链接:减少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 发布版的测试不够全面,囧

http://blog.csdn.net/cuteqt/article/details/5912661

减少Qt编译时间暨简单Qt裁剪的更多相关文章

  1. Android提升Gradle编译速度或减少Gradle编译时间.md

    目录 Android如何提升Gradle编译速度或减少Gradle编译时间 最终优化方案 优化效果比对 将所有项目源码,各种缓存临时目录都移动到高性能SSD磁盘上 gradle.properties ...

  2. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  3. 使用VC2005编译真正的静态Qt程序

    首先,你应该该知道什么叫静态引用编译.什么叫动态引用编译.我这里只是简单的提提,具体的可以google一下. 动态引用编译,是指相关的库,以dll的形式引用库.动态编译的Exe程序尺寸比较小,因为相关 ...

  4. Linux 下编译并安装配置 Qt 4.53全过程

    最近准备做 Nokia 的 Symbian,Maemo 下触摸屏开发.考虑到程序的跨平台可移植性,最终选择使用 Qt 开发.相对来说,国内关于 Qt 相关文档并不算很多.作者将 Linux 下编译并安 ...

  5. 使用VC2005编译真正的静态Qt程序 good

    首先,你应该该知道什么叫静态引用编译.什么叫动态引用编译.我这里只是简单的提提,具体的可以google一下. 动态引用编译,是指相关的库,以dll的形式引用库.动态编译的Exe程序尺寸比较小,因为相关 ...

  6. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  7. 减少C++代码编译时间的方法

    c++ 的代码包含头文件和实现文件两部分, 头文件一般是提供给别人(也叫客户)使用的, 但是一旦头文件发生改变,不管多小的变化,所有引用他的文件就必须重新编译,编译就要花时间,假如你做的工程比较大(比 ...

  8. 让QT编译快一点(增加基础头文件)

    姚冬,中老年程序员 进藤光.杨个毛.欧阳修 等人赞同 我是来反对楼上某些答案的.我曾经用MFC写了金山词霸(大约20多万行),又用Qt写了YY语音(大约100多万行),算是对两种框架都比较有经验.纠正 ...

  9. Qt编译慢吗?

    1. “用Qt写的程序编译比MFC慢”的说法是错误的绝对错误,单位代码行数编译Qt远比MFC快得多,因为Qt库的头文件设计非常好,尽量都使用了前置声明,避免了头文件嵌套,几乎所有类都使用了公有类和私有 ...

随机推荐

  1. win10 uwp 线程池

    原文:win10 uwp 线程池 如果大家有开发 WPF 或以前的程序,大概知道线程池不是 UWP 创造的,实际上在很多技术都用到线程池. 为什么需要线程池,他是什么?如何在 UWP 使用线程池,本文 ...

  2. 解决mysql连接异常—-com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception

    DBCP连接池连接MySql数据库时,一奇葩数据库设置为30秒内无请求自动断开.超时后链接无法关闭,活动链接数飞奔,最后挂掉. 网上找了一圈,一般是这三种,方法一pass,方法二测试无效可能设置错了吧 ...

  3. JScript实现将指定目录下的vc工程加到解决方案

    作者:朱金灿 来源:http://blog.csdn.net/clever101 main(); function main() { try { var WSShell = WScript.Creat ...

  4. 阐述php(五岁以下儿童) 注意事项和使用功能

    1.函数声明 <?php /** * function 函数名(參数1, 參数2.... ){ * 函数体; * 返回值; * } */ $sum = sum(3, 4); echo $sum; ...

  5. 双目相机标定以及立体测距原理及OpenCV实现

    单目相机标定的目标是获取相机的内参和外参,内参(1/dx,1/dy,Cx,Cy,f)表征了相机的内部结构参数,外参是相机的旋转矩阵R和平移向量t.内参中dx和dy是相机单个感光单元芯片的长度和宽度,是 ...

  6. 细数 Windows Phone 灭亡的七宗罪(过程很详细,评论很精彩,但主要还是因为太慢了,生态跟不上,太贪了,厂商不愿意推广)

    曾梦想仗剑走天涯,看一看世界的繁华 年少的心有些轻狂,如今你四海为家 曾让你心疼的姑娘,如今已悄然无踪影 犹记得上大学攒钱买了第一台智能手机Lumia 520时,下载的第一首歌曲<曾经的你> ...

  7. CefSharp For WPF自定义右键菜单栏

    原文:CefSharp For WPF自定义右键菜单栏 初始化 <!--浏览器--> <cefSharpWPF:ChromiumWebBrowser Name="webBr ...

  8. 多线程——继承Thread类别

    详细java此前使用多线程,让我们来看看下面的问题. 什么是多线程     简单的理解成:cpu"同一时候"运行多个任务,这就是多线程. (究其本质,当涉及到进程和线程的概念.上面 ...

  9. android 随着认识的去除率EditText(它配备了防抖效果)

    Android它没有提供的类似至ios自带的输入框效果清晰(ios简单地只加属性可实现).因此,Android其中 我们要如何实现就需要这种效果用自己的定义的控件实现. 思路:能够使用一个Linear ...

  10. debian 下py2.7 安装mysql模块

    先安装pip 然后用pip安装 setuptools 安装模块的时候会报错 python setup.py install sh: mysql_config: command not found Tr ...