Yocto环境下Qt5.10手动Lite化方法介绍

目录

1 引言

2 Qt Lite介绍

3 手动裁剪

3.1 基于yocto的qt裁剪介绍

3.2 裁剪qtbase为例

4 编译报错解决

1 引言

       本文针对yocto环境下qt5.10的裁剪进行详细的分析与步骤说明介绍,Qt5.8版本开始Qt Lite目的是使Qt适用于任何平台,多种内存大小硬件的运行环境。在硬件平台上运行yocto系统几乎都是针对嵌入式设备,所以对Qt的库进行裁剪也就可以减小存储空间的开销。

2 Qt Lite介绍

        首先,摘抄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 moduleAPIs接口;所以,裁剪Qt的方式总结为以下两种:修改配置文件The configuration system和使用相关工具Tooling

  • The configuration system

       轻松实现基于功能的Qt模块定制。针对Qt CoreQt NetworkQt GUIQt QMLQt 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编译时可以选择的第三方库如下所示

Yocto环境下Qt5.10手动Lite化方法介绍_第1张图片 

  • Tooling

       除了configuration system,还有一种图形工具,用于构建Qt时的配置,选择和设置各种选项。

Qt的裁剪工具需要商业版授权的Qt安装包才能使用,所以下图为使用的30天试用版Qt Online安装包安装之后的QtConfigGui目录(注意:社区版的setup中是没有Qt configuration Tools工具的,裁剪工具为:qConfig-gui.exe,双击运行即可。

Yocto环境下Qt5.10手动Lite化方法介绍_第2张图片

Qt Configuration Tool运行之后界面

Yocto环境下Qt5.10手动Lite化方法介绍_第3张图片

3-Features selection中可看到内容为qt 的相关module和能够裁剪的feature

Yocto环境下Qt5.10手动Lite化方法介绍_第4张图片

但是由于缺少收费版Qt Automotive Suite工具,所以试用版不能使用Qt Configuration Tool生成裁剪配置文件,
但是我们可以用该工具分析裁剪流程,在源码中手动进行裁剪。

3 手动裁剪

3.1 基于yocto的qt裁剪介绍

        从第二章中我们知道了两种裁剪方法,如果是非土豪用户或公司,还是选择手动裁剪吧!本文是基于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系统,可以通过上面的介绍总结为:

  • 裁剪配置完成之后点击: File > Export Features for Boot2Qt
  • 输出配置文件为qt5-features
  • 例如修改的是:qtbase_git.bb文件,则创建一个qtbase_git.bbappend文件,在该文件中输入:inherit qt5-features
  • 编译工程即可裁剪掉Qt Configuration Tool工具中配置的remove feature

3.2 裁剪qtbase为例

接下来以qtbase为例来进行裁剪介绍,qtbase的结构为:

                                                        Yocto环境下Qt5.10手动Lite化方法介绍_第5张图片

裁剪之前的存储空间占用统计

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 sourceconfigure.json,以qtbasexml为例,其中的configure.json文件内容如下图所示。只有存在configure.json文件且文件有features字段,在Qt Configuration Tool才能显示裁剪选项。

                                                                  Yocto环境下Qt5.10手动Lite化方法介绍_第6张图片

所以只需要创建qtbase_git.bbappend文件,在文件中添加如下内容:

QT_CONFIG_FLAGS += " \
  -no-feature-dom \
 "

即可裁剪掉qtbasexml。其它内容的裁剪跟讲述方法类似。接下来展示一下极限裁剪之后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

4 编译报错解决

在将qtbase裁剪到最小之后,需要如果加入其他qt mudules。此时编译可能会下面类型的错误:

762:47: error: static assertion failed: Required feature filedialog for file /usr/include/qt5/QtWidgets/qfiledialog.h not available.

此时报错提醒为: filedialog filedialogwidgets中的feature,见下图。

                                           Yocto环境下Qt5.10手动Lite化方法介绍_第7张图片

图中condition中的feature也不要能被裁掉,因此寻找其依赖的嵌套feature,见下图,图中依赖引申出来的feature都不应该被裁掉。

                            Yocto环境下Qt5.10手动Lite化方法介绍_第8张图片

其他类似的报错分析方法类似!

你可能感兴趣的:(Qt5,C++,Linux)