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

4 篇文章 2 订阅
4 篇文章 0 订阅

目录

1 引言

2 Qt Lite介绍

3 手动裁剪

3.1 基于yocto的qt裁剪介绍

3.2 裁剪qtbase为例

3.3 源码中的宏定义裁剪

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-<feature>和-no-feature-<feature> 选项
./configure -no-feature-accessibility

        第三方库使用-no代替来禁用对这些库的支持-qt。例如,要使用系统的xcb库并禁用zlib支持,请输入以下内容:

./configure -no-zlib -qt-libjpeg -qt-libpng -system-xcb

        qt编译时可以选择的第三方库如下所示

  • Tooling

       除了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生成裁剪配置文件,
但是我们可以用该工具分析裁剪流程,在源码中手动进行裁剪。

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的结构为:

                                                        

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

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才能显示裁剪选项。

                                                                  

所以只需要创建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

3.3 源码中的宏定义裁剪

有时候会在qtbase源码中发现如下宏定义:

QT_NO_NETWORKPROXY

QT_NO_SSL

QT_NO_BEARERMANAGEMENT

#ifndef QT_NO_NETWORKPROXY
    void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
#endif
    void authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
    void finished(QNetworkReply *reply);
#ifndef QT_NO_SSL
    void encrypted(QNetworkReply *reply);
    void sslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
    void preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator);
#endif

#ifndef QT_NO_BEARERMANAGEMENT
    void networkSessionConnected();

    void networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible);
#endif

在meta-qt5中其实裁剪起来比较简单,我们看一下qtbase中network configure.jason中的features:

以bearermanagement为例:

"bearermanagement": {
         "label": "Bearer management",
         "purpose": "Provides bearer management for the network stack.",
         "section": "Networking",
         "condition": "features.library && features.networkinterface && features.properties",
         "output": [ "publicFeature", "feature" ]
     },

所以作为一个feature,完全可以在bb文件中将其裁剪掉。

meta-qt5.10.1/recipes-qt/qt5/qtbase_git.bb

QT_CONFIG_FLAGS += " \
     ${QT_CONFIG_FLAGS_GOLD} \
     -shared \
     -silent \
     -no-pch \
     -no-rpath \
     -pkg-config \
     -no-feature-bearermanagement \
     ${PACKAGECONFIG_CONFARGS} \
"

 

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,见下图。

                                           

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

                            

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值