`
duyouhua1214
  • 浏览: 239527 次
  • 性别: 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系列的一个重要版本,它提供了丰富的功能和改进,旨在帮助开发者构建高性能、高质量...

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

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

    Qt编译Geos库

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

    Ubuntu下Qt静态编译以及使用

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

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

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

    qtXlsx 已经编译好的库

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

    Qt 5.15.1 MSVC static 静态编译包

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

    Qt6.0 编译工具

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

    ubuntu 上 qt静态编译版本制作

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

    Windows mingw QT静态编译

    完成了基础环境的搭建后,接下来进行QT静态库的编译和安装步骤: 1. **检查软件安装配置** - 运行Qt5.5 for Desktop (MinGW 4.9.2 32bit) cmd命令框。 - 检查编译环境是否正确配置: - 输入`gcc -v`查看gcc...

    win7 64位Qt5.4.0静态编译配置

    ### Win7 64位Qt5.4.0静态编译配置详解 #### 系统环境及准备 本文档详细介绍了在Windows 7 64位系统环境下进行Qt5.4.0静态编译的步骤。为了顺利完成编译工作,需要预先安装一系列支持工具,并对环境变量进行必要的...

    Qt_静态编译

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

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

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

    Windows下Qt静态编译连接和DLL依赖问题解决.doc

    ### Windows下Qt静态编译连接和DLL依赖问题详解 #### 一、背景介绍 在Windows平台上使用Qt进行软件开发时,经常会遇到与编译器相关的动态链接库(DLL)依赖问题,尤其是当开发者选择静态编译Qt库时。这类问题不仅会...

    Qt5.6.2交叉编译mysql.pdf

    ### Qt5.6.2 交叉编译 MySQL 驱动知识点详解 #### 一、基础知识概述 在深入了解Qt5.6.2交叉编译MySQL的相关步骤之前,我们需要先了解几个基本概念: - **Qt**:一个跨平台的应用程序开发框架,支持多种操作系统。...

    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版本中,它提供了丰富的图形类型和定制选项,使得开发者能够轻松地在...

    Qt5自动配置编译环境

    **Qt5自动配置编译环境详解** 在进行Qt5开发时,设置正确的编译环境是至关重要的步骤。本文将详细讲解如何使用“Qt5编译懒人包”以及VS2008进行Qt5的配置,帮助开发者节省时间和精力。 首先,让我们了解“Qt5编译...

    qt for windows版本下编译qtdbus模块

    完成以上步骤后,在指定目录下会生成 Qt5DBus.dll 和 Qt5DBusd.dll 文件及其对应的库文件。 ##### C. 生成 QtDBus Tools 接下来需要生成并安装位于 `D:\Qt\Qt5.2.0_win\5.2.0\Src\qttools\src\qdbus` 及 `D:\Qt\Qt...

    OSG+Qt编译说明

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

Global site tag (gtag.js) - Google Analytics