`
duyouhua1214
  • 浏览: 236272 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

详解 Qt 选择性编译和库裁减

    博客分类:
  • QT
 
阅读更多

本文介绍的是 Qt 选择性编译和库裁减,帮你节约时间的一篇文章,先来看内容。

AD:

 

Qt 选择性编译裁减是本文将要介绍的内容,编译一次Qt要耗费太多的时间,常常是越着急用它,编起来越慢。其实通过很简单的几招可以帮你节省编译的时间。下面就一一道来:

编译之前确定哪些功能是不必要的,对编译树进行简单裁剪

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

  1. QT_DEFAULT_BUILD_PARTS=”libs tools examples demos docs translations” 

可以把examples、demos和docs从这里去掉,但要注意,别的可不能随便去掉。

如果在后面的使用中发现有些小工程需要编译了,可以采用一般编译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系统下可以用下面的命令来编译:

  1. $ cd qt-embedded-linux-commercial-4.4.1/tools/qconfig  
  2. $ /usr/local/Trolltech/Qt-4.4.3/bin/qmake  
  3. $ 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编译出来为:

  1. libQtCore.so是2.6M  
  2. libQtGui.so是9.5M 

如果用small来编译,就能缩小为:

  1. libQtCore.so是2.0M  
  2. libQtGui.so是5.7M 

差异还是比较明显的。

小结:Qt 选择性编译裁减的内容介绍完了,希望本文对你有所帮助。更多内容请参考编辑推荐。

 

来源:http://www.cppblog.com/lauer3912/archive/2011/07/26/151834.html

分享到:
评论

相关推荐

    Qt5.15.2官方动态编译库

    **Qt5.15.2官方动态编译库详解** Qt是一个跨平台的应用程序开发框架,主要用于C++编程,但同时也支持QML和其他语言。Qt5.15.2是Qt系列的一个重要版本,它提供了丰富的功能和改进,旨在帮助开发者构建高性能、高质量...

    Qt编译Geos库

    ### Qt编译Geos库详解 #### 一、前言 本文档旨在详细介绍如何在Windows环境下使用Qt编译Geos库,并进一步说明如何在新建的Qt项目中正确配置及使用Geos库。Geos(Geometry Engine Open Source)是用于处理几何对象...

    完美编译mupdf-qt动态链接库

    **完美编译mupdf-qt动态链接库详解** mupdf-qt是MuPDF的Qt界面版本,它提供了一个轻量级、高效且可定制的PDF查看器,支持多种平台。在Windows环境下,通常使用Visual Studio(VS)作为编译工具,配合Qt库来构建...

    Ubuntu下Qt静态编译以及使用

    ### Ubuntu 下 Qt 静态编译及使用详解 #### 一、引言 在开发跨平台的应用程序时,Qt 是一个非常强大的选择。对于希望将应用程序发布到多个 Linux 发行版上的开发者而言,静态编译 Qt 可以极大地简化部署流程。本文...

    Qt5.15.12静态库-已编译版本-Windows64位-VS2019编译

    **Qt5.15.12 静态库详解** Qt是一个强大的跨平台应用程序开发框架,被广泛用于创建桌面、移动以及嵌入式系统的图形用户界面。此资源是Qt5.15.12的预编译静态库版本,特别针对Windows 64位操作系统,并且是使用...

    Qt 5.15.1 MSVC static 静态编译包

    在压缩包文件`msvc-static`中,通常会包含所有静态编译的Qt库文件,以及必要的头文件和库文件。这些文件是编译过程的产物,用于构建和运行使用静态Qt库的应用程序。确保在项目设置中指向这个目录,以便正确链接静态...

    Qt6.0 编译工具

    **Qt6.0 编译工具详解** Qt6.0 是一个强大的跨平台应用程序开发框架,广泛用于构建桌面、移动和嵌入式系统的GUI(图形用户界面)应用。要从源代码编译Qt6.0,你需要一套完整的编译工具链。这个压缩包提供了编译Qt...

    qtXlsx 已经编译好的库

    **QtXlsx 库详解** QtXlsx 是一个基于 Qt 框架的开源库,专为处理 Microsoft Excel 文件(.xlsx 格式)而设计。这个库提供了一个方便的 API,使得在 Qt 应用程序中读写 Excel 数据变得简单易行。你已经获得了一个...

    ubuntu 上 qt静态编译版本制作

    ### Ubuntu上Qt静态编译版本制作详解 #### 概述 在进行跨平台软件开发时,经常遇到的一个问题是,如何让编译好的程序能够在没有安装Qt的机器上直接运行,而不依赖于Qt的相关动态库(如.so文件)。解决这一问题的...

    嵌入式qt库编译文档

    在开始编译过程之前,请确保您的开发环境已经安装了必要的工具链和库文件,包括但不限于交叉编译器(如`arm-linux-gcc`)、构建工具(如`make`),以及其他相关的依赖库。 #### 步骤详解 ### 1. 编译tslib库 **...

    Qt_静态编译

    为了解决这一问题,可以采用静态编译的方式,将 Qt 库编译进应用程序中,从而提高应用程序的便携性和独立性。 #### 四、静态编译的步骤 ##### 步骤一:准备工具 1. **下载 Qt SDK**:访问 Qt 官方网站 ...

    RabbitMQ客户端qamqp库源码和QT调用demo.tar.gz

    **RabbitMQ客户端qamqp库源码与QT调用示例详解** RabbitMQ是一种广泛应用的消息中间件,它基于AMQP(Advanced Message Queuing Protocol)协议,提供高可用、可扩展的消息传递服务。在本资源中,我们将探讨qamqp库...

    QT4 VC2005 编译 详解

    ### QT4.4.3与Windows VS2005编译安装详解 #### 一、安装准备 在开始编译安装QT4.4.3之前,需要做好一系列准备工作。 ##### 1. 准备安装文件 - **QT 4.4.3 OpenSource for Windows** 下载地址: `ftp://ftp....

    QtCharts5.7.0源码及编译安装教程

    **QtCharts 5.7.0 源码与编译安装详解** QtCharts是Qt框架中的一个模块,专门用于创建各种数据可视化图表,如折线图、柱状图、饼图等。在5.7.0版本中,它提供了丰富的图形类型和定制选项,使得开发者能够轻松地在...

    log4qt模块由msvc2017及mingw编译的32位及64位库文件

    它编译出的库文件同样支持32位和64位系统,但可能需要额外处理与Windows特定API的兼容性问题。 **2. 架构与组件** `Log4Qt`的核心组件包括以下部分: - **Logger**: 日志记录的主入口点,负责管理所有日志记录器...

    Qt MQTT 6.4.3 MSVC2019 编译好的

    **Qt MQTT 6.4.3 MSVC2019 编译详解** Qt MQTT是Qt框架中的一个组件,用于支持MQTT(Message Queuing Telemetry Transport)协议,这是一种轻量级的消息传输协议,常用于物联网(IoT)设备间的通信。在6.4.3版本中,...

    OSG+Qt编译说明

    ### OSG+Qt编译说明详解 #### 一、前言 本文旨在详细介绍如何通过CMake工具配合Visual Studio 2013来编译OpenSceneGraph(OSG)与Qt集成项目的过程。此过程适用于希望将OSG与Qt集成开发三维图形应用的开发者。 ###...

    qt5.2.0编译boost库文件

    **Qt5.2.0与Boost库的集成详解** 在软件开发中,Qt与Boost库的结合使用可以增强应用程序的功能和性能。本文将详细介绍如何在Qt5.2.0环境下编译并集成Boost库,以充分利用Boost的强大功能。 首先,Boost库是一个...

Global site tag (gtag.js) - Google Analytics