编译一次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
差异还是比较明显的。
相关推荐
QT选择性深度裁剪是一种优化Qt库的方法,目的是减少库的体积,提高应用程序在特定硬件上的运行效率。本文将详细解析如何进行QT裁剪,并提供一个具体的裁剪配置示例。 首先,我们要理解QT裁剪的基本原理。QT库包含了...
这个"Qt编写的裁剪图片软件"显然是一个利用Qt库实现的图形用户界面(GUI)应用程序,专门用于对图像进行裁剪操作。 在描述中提到的"可以拖动矩形框进行图片裁剪",这是Qt中的关键功能之一。Qt提供了丰富的图形视图...
在本文中,我们将深入探讨如何使用Qt和OpenCV这两个强大的开源库来实现头像剪裁功能。Qt是一个跨平台的应用程序开发框架,广泛用于创建GUI应用程序;而OpenCV则是一个计算机视觉库,提供了丰富的图像处理和机器学习...
【QT C++拼图游戏】是一款基于Qt界面开发库创建的桌面应用程序,它结合了C++编程语言的强大功能和Qt库的易用性,为用户提供了一种有趣且互动的拼图体验。Qt库是一个跨平台的开发框架,支持Windows、Linux、macOS等多...
本文将详细介绍如何在嵌入式平台上搭建开发环境,以及如何利用Qt和Linphone库来设计和实现IP电话系统。 首先,【硬件平台搭建】是整个项目的基石。选择合适的嵌入式处理器和外围硬件是关键,这些硬件通常包括微处理...
Qt开发的电子相册是一种利用Qt库创建的多媒体应用程序,主要功能是展示并管理个人照片。这个项目实现了多种用户友好的交互特性,如上下翻页、自动播放、图片的放大缩小以及顺时针和逆时针旋转等。下面将详细讨论Qt...
在本文中,我们将深入探讨如何使用Qt库来创建一个简单的屏幕截图工具。Qt是一个跨平台的应用程序开发框架,广泛应用于图形用户界面(GUI)应用程序的构建。它提供了丰富的API和工具,使得开发者能够轻松实现各种功能...
在Qt库中,示例和演示程序是学习和理解其功能和用法的重要资源。"40000 chips"是Qt中一个经典的例子,它展示了如何高效地处理大量图形对象,比如在游戏或者数据可视化场景中。这个例子中,我们将深入探讨其核心功能...
首先,`QDialog`是Qt库中的一个核心组件,它用于创建对话框窗口,通常用来显示临时信息或接收用户输入。与`QWidget`不同,`QDialog`提供了更多的对话框特定功能,如默认的关闭按钮和窗口焦点管理。 要创建异形窗口...
QT_APP添加背景图片是Qt应用程序开发中的一个常见需求,它涉及到Qt库中的图像处理和界面设计。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动以及嵌入式设备的软件开发。在Qt中,我们可以利用QPixmap和...
在本项目"qt_project9_pixmapCut.zip"中,我们主要关注的是使用Qt库来创建一个屏幕剪切应用程序。这个程序涉及到的关键技术是QPixmap和QTimer,它们都是Qt库中的核心组件,对于Qt初学者来说是必须要掌握的基础知识点...
1. **Qt框架**:Qt库提供了丰富的组件和工具,用于构建图形用户界面。在PuzzleGame中,Qt的Widget类可能被用来创建游戏窗口,QPushButton用于设置开始、暂停、重置等操作按钮,QLabel用于显示游戏状态和提示信息,而...
在Qt库中,位置相关的函数是开发者处理图形用户界面(GUI)布局和元素对齐的重要工具。本实例“Qt位置相关函数汇总实例Geometry.zip”主要涵盖了Qt中的几何形状、坐标系统以及窗口和控件的位置管理。以下是对这些...
Qt5是Qt库的一个重要版本,提供了丰富的API和组件,使得开发者能够快速构建高效且美观的应用程序。本资源是一个基于Qt5制作的屏幕截图控件,旨在提供一种便捷、可扩展的方式来实现屏幕截图功能。 这个屏幕截图控件...
QT4 Widget程序是一种基于Qt库开发的用户界面应用程序,它主要使用了Qt4框架中的Widget模块。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动设备和嵌入式系统中,支持Windows、Linux、MacOS等操作系统。在...
QT的GraphicsView框架是Qt库中的一个重要组成部分,它提供了一个高度可定制的2D图形视图,用于在窗口中显示和操作复杂的图形元素。GraphicsView框架适用于创建绘图应用程序、图表、游戏等,其核心是GraphicsView、...
Qt Graphics View是Qt库中的一个强大框架,专为创建复杂的、图形密集型用户界面而设计。这个框架允许开发者以一种灵活、高效的方式处理2D图形,包括缩放、旋转、平移以及对象交互等操作。在Qt应用中,Graphics View...
本项目"Qt QLabel滚动字幕.zip"显然是一个利用Qt库中的QLabel组件实现滚动字幕效果的示例。QLabel是Qt中的一个基本组件,通常用来显示文本、图像或者图标。在这个项目中,QLabel被扩展以实现动态滚动文字的效果,这...
- **Qt/E4 (Qt/Embedded)**: 是Qt库的一个子集,专为嵌入式设备设计,提供了GUI开发框架,简化了用户界面的开发过程。Qt/E4相较于早期版本进行了大量改进,提升了性能和稳定性。 2. **SQLite3数据库** - **SQLite...
对于初学者来说,理解QPainter的基本绘图原理和熟练运用pen和brush是非常关键的,而对QT库的深入理解和探索则是提升应用水平的重要途径。 最后,`paintertest`这个文件可能是实现上述功能的一个示例程序或测试代码...