目录
1 引言
2 Qt Lite介绍
3 手动裁剪
3.1 基于yocto的qt裁剪介绍
3.2 裁剪qtbase为例
4 编译报错解决
本文针对yocto环境下qt5.10的裁剪进行详细的分析与步骤说明介绍,从Qt5.8版本开始,Qt Lite的目的是使Qt适用于任何平台,多种内存大小硬件的运行环境。在硬件平台上运行yocto系统几乎都是针对嵌入式设备,所以对Qt的库进行裁剪也就可以减小存储空间的开销。
首先,摘抄Qt Lite的官网介绍:
The new configuration system allows removing individual pieces of functionality and APIs from Qt, creating a more lightweight set of libraries for deployment.
从上述的描述可知:Qt Lite的裁剪方式为移除相关Qt module和APIs接口;所以,裁剪Qt的方式总结为以下两种:修改配置文件The configuration system和使用相关工具Tooling。
轻松实现基于功能的Qt模块定制。针对Qt Core,Qt Network,Qt GUI,Qt QML和Qt Quick等模块进行裁剪,微调要包含在项目中的这些模块的功能。
configuration配置文件中模块和功能的禁用配置语法:
剔除模块
./configure -skip qtconnectivity
包含或剔除特性feature
使用-feature-和-no-feature- 选项
./configure -no-feature-accessibility
第三方库使用-no代替来禁用对这些库的支持-qt。例如,要使用系统的xcb库并禁用zlib支持,请输入以下内容:
./configure -no-zlib -qt-libjpeg -qt-libpng -system-xcb
qt编译时可以选择的第三方库如下所示
除了configuration system外,还有一种图形工具,用于构建Qt时的配置,选择和设置各种选项。
Qt的裁剪工具需要商业版授权的Qt安装包才能使用,所以下图为使用的30天试用版Qt Online安装包安装之后的QtConfigGui目录(注意:社区版的setup中是没有Qt configuration Tools工具的,裁剪工具为:qConfig-gui.exe,双击运行即可。
Qt Configuration Tool运行之后界面
3-Features selection中可看到内容为qt 的相关module和能够裁剪的feature
但是由于缺少收费版Qt Automotive Suite工具,所以试用版不能使用Qt Configuration Tool生成裁剪配置文件,
但是我们可以用该工具分析裁剪流程,在源码中手动进行裁剪。
从第二章中我们知道了两种裁剪方法,如果是非土豪用户或公司,还是选择手动裁剪吧!本文是基于yocto系统的,如果买了商业版的Qt,会给出一个基于yocto的裁剪方法。方法介绍如下:
Launch the tool and export features from a Qt build to Boot to Qt as follows:
Select your Qt build's build directory (1).
Enable and disable the features in the tree view (3).
Select File > Export Features for Boot2Qt.
Browse a directory and select Choose.
The selected folder contains one feature file for each Qt module that has feature flags configured.
In your Yocto build, do the following actions for each module that you have the feature file for:
Create a new recipe extension for the module. For example, qtdeclarative_git.bbappend.
In the created .bbappend file, add the line inherit qt5-features.
Put the module's feature file, for example, qtdeclarative.opt, under a features/ next to your .bbappend file.
上面介绍是针对yocto系统,可以通过上面的介绍总结为:
接下来以qtbase为例来进行裁剪介绍,qtbase的结构为:
裁剪之前的存储空间占用统计
19.0K libQt5Concurrent.so.5.10.1 |
5.3M libQt5Core.so.5.10.1 |
493.0K libQt5DBus.so.5.10.1 |
4.1M libQt5Gui.so.5.10.1 |
1.4M libQt5Network.so.5.10.1 |
265.0K libQt5OpenGL.so.5.10.1 |
326.0K libQt5PrintSupport.so.5.10.1 |
252.0K libQt5Sql.so.5.10.1 |
188.0K libQt5Test.so.5.10.1 |
4.9M libQt5Widgets.so.5.10.1 |
193.0K libQt5Xml.so.5.10.1 |
17.4M total |
通过第二章介绍可知,Qt Configuration Tool中识别的是各个feature source的configure.json,以qtbase的xml为例,其中的configure.json文件内容如下图所示。只有存在configure.json文件且文件有features字段,在Qt Configuration Tool才能显示裁剪选项。
所以只需要创建qtbase_git.bbappend文件,在文件中添加如下内容:
QT_CONFIG_FLAGS += " \
-no-feature-dom \
"
即可裁剪掉qtbase中xml。其它内容的裁剪跟讲述方法类似。接下来展示一下极限裁剪之后qtbase的大小,从裁剪之前的17.4M到10M,减少了7.4M的大小。
这个裁剪大小还是比较可观的。
252.0K |
libQt5Sql.so.5.10.1 |
10M |
0 |
libQt5OpenGL.so.5.10.1 |
|
24.0K |
libQt5Concurrent.so.5.10.1 |
|
2.9M |
libQt5Gui.so.5.10.1 |
|
840.0K |
libQt5Network.so.5.10.1 |
|
3.4M |
libQt5Core.so.5.10.1 |
|
8.0K |
libQt5PrintSupport.so.5.10.1 |
|
108.0K |
libQt5Xml.so.5.10.1 |
|
2.2M |
libQt5Widgets.so.5.10.1 |
|
0 |
libQt5DBus.so.5.10.1 |
|
196.0K |
libQt5Test.so.5.10.1 |
|
116K |
plugins |
在将qtbase裁剪到最小之后,需要如果加入其他qt mudules。此时编译可能会下面类型的错误:
762:47: error: static assertion failed: Required feature filedialog for file /usr/include/qt5/QtWidgets/qfiledialog.h not available.
此时报错提醒为: filedialog, filedialog为widgets中的feature,见下图。
图中condition中的feature也不要能被裁掉,因此寻找其依赖的嵌套feature,见下图,图中依赖引申出来的feature都不应该被裁掉。
其他类似的报错分析方法类似!