在硬件板卡提供商提供的嵌入式linux平台下的Qt环境中,很多时候会存在许多问题:
(1)可能一些Qt的模块不支持。这时候要么找厂家,要么自己编译。
(2)在厂家提供的平台开发环境中,支持的东西太多,太杂,导致整个文件系统镜像太大。这时候为了减小根文件系统,往往需要自己集成和编译开发环境。
(3)不同版本Qt编译构建出的库文件,一般会不兼容,需要针对特定版本进行交叉编译。
本文主要是记录在Qt源码跨平台源码编译构建过程中的一些注意点以及自己的思考。因平台太多,软件环境大多不同,故不会针对特定平台进行详细步骤描述,所以记录些共同点,细节点就略过啦。如果有疑问,可以加小生微信相互交流,互相学习,哈哈!
编译Qt源码,首先就获取源码,从Qt官方网站https://download.qt.io/archive/qt/获取源码。将其解压缩,完成后如下图所示:
从目录结构来观察,源码结构以模块方式高度划分。Qt的各个模块都可以单独编译,当然一般使用最多的是整体编译。在使用工具(例如buildroot)制作嵌入式linux根文件系统时,对Qt部分是自动编译的(暂不清楚里面的构建细节)
在上图中,有一个qtbase目录,该目录是Qt的基础模块目录,该目录下同样有configure文件(在源码目录下也有一个configure配置文件,这两个文件不一样)
在Qt源码目录下执行:
./configure --help
会打印出帮助信息,在/qtbase目录下使用上述命令同样会打印帮助信息,只是在此处打印出的信息比在源码目录下使用confiigure --help命令打印出的帮助信息少。
当我们在Qt源码目录下执行./configure命令时,可以配置整体编译方案,我们则可以在此处设置想要编译构建的参数和模块。
在/qtbase目录下,执行./configure命令时,配置的是在该目录下的Qt基本模块。从源码目录结构,可以知道在qtbase模块下包含许多子模块:
其中包含:core、network、sql、widget等。
只编译构建qtbase,开发运行常见窗体应用是可以的
mkspecs目录
在qtbase目录下,存放了多个目录,如下图所示:
因为Qt是跨平台的,在该目录下则存放了许多与具体平台相关的目录,目录的名称则是以具体架构来命名,且目录中存放了两个文件:
qmake.conf:该文件是关于具体架构的qmake配置描述,一般内容格式如下:
# # qmake configuration for building with aarch64-linux-gnu-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = aarch64-linux-gnu-gcc QMAKE_CXX = aarch64-linux-gnu-g++ QMAKE_LINK = aarch64-linux-gnu-g++ QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++ # modifications to linux.conf QMAKE_AR = aarch64-linux-gnu-ar cqs QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy QMAKE_NM = aarch64-linux-gnu-nm -P QMAKE_STRIP = aarch64-linux-gnu-strip load(qt_config)
qplatformdefs.h:该文件是一个头文件,文件中内容用于描述具体模块层级包含的相关头文件依赖。
qmake.conf是一个重要的文件,在针对具体平台编译构建源码时,可能需要修改该文件下的内容:
在上述图片中,等号右边表示具体的编译构建工具名称。需要提前安装对应的编译套件且将他们添加到环境变量中(如果没有添加,可以以绝对路径来描述)。例如,如果是在linux平台下,且将编译器添加到了环境变量中,可以使用编译器名称加上v参数选项查看编译器信息,此处以交叉编译器aarch64-linux-gnu为例:
编译构建qtbase
本小节以在ubuntu系统下,交叉编译Arm64平台的Qt版本为目标。记录qtbase的编译构建步骤。
交叉编译器为:gcc-linara-6.3.1-2017.05-x86_64_aarch64-linux-gnu
(1)准备好交叉编译工具后,将交叉编译器的路径添加到ubuntu环境变量中。参见《一文分享linux的环境变量》一文。
(2)在源码目录下使用cd qtbase将终端切换到qtbase目录下。
(3)查看/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf文件内容。编译器一栏所填写的命令,需要与交叉编译器套件名称一样。小生的交叉编译器套件如下图所示:
(经对比,qmake.conf文件中交叉编译器名称与上图所示名称一样,故此处不用修改qmake.conf文件)
(4)在终端使用下列命令:
./configure -prefix 编译安装的目录路径 -xplatform linux-aarch64-gnu-g++ -no-opengl -opensource -confirm-license -release -strip -shared -c++std c++11 --sqlite=qt -recheck-all
(注:可以将上述内容写成脚本,直接在终端下运行即可)
-prefix:该参数用于指定Qt编译完成后安装时的输出目录。
-xplatform:用于交叉编译时选择目标mkspec。(需与qtbase/mkspec目录下的目录名称一样)
其他参数含义可以使用./configure -help打印出帮助信息查看。
(5)使用make -j12编译构建qtbase。(-j12表示同时允许的任务数,计算机性能好,就指定12或更高。计算机性能弱就指定低数值或不指定-j参数)
注:根据编译构建环境的硬件配置,整个编译构建过程可能会需要几分钟甚至几十分钟。
(6)编译完成后,在终端使用make install命令将编译成功后的文件安装到-prefix参数指定的路径下。
安装完成后,会在-prefix参数指定的路径下自动创建几个目录,如下图所示:
bin:该目录下包含生成的Qt版本的二进制程序。例如:moc、qmake、rcc、uic等Qt构建工具。
doc:为对应模块的文档目录。
examples:该目录中存放的是与该模块相关的Qt演示demo(源码+生成的可执行体)。
include:该目录存放与该模块相关的包含头文件。
lib:该目录下存放的是与该模块相关的库文件。
plugins:该目录下存放插件目录,在对应插件目录下存放着对应的插件库文件。
在上述过程中,我们已经编译构建且安装好了qtbase,如果在开发中,还想增加其他的组件模块,我们可以直接到模块对应的目录路径下编译即可。例如,如果想编译构建qtcharts模块,可以按照如下步骤进行:
(1)切换到qtcharts目录路径下,打开终端。
(2)用在qtbase编译出的qmake工具来配置(这个qmake会自动延用qtbase交叉编译时的配置),qmake工具位于-prefix参数指定的路径下的bin目录中:
编译安装的目录路径/bin/qamke
(3)使用make -j12编译构建。
(4)使用make install安装。
完整编译构建Qt源码
完整编译Qt源码指的是在Qt源码路径下进行编译,使用configure对Qt进行编译配置时指定需要编译的模块。
完整编译构建步骤如下:
(1)与上述编译qtbase一样,需要确保准备好了交叉编译器环境,且配置好具体目标平台下的qmake配置文件,然后在Qt源码目录下打开终端。
(2)使用下列命令配置Qt源码:
#! /bin/sh ./configure -prefix /home/Qt/qt-everywhere-src-5.12.9/arm-qt -opensource -confirm-license -release -strip -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -c++std c++11 --rpath=no -pch -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtwayland -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -make examples -nomake tools -nomake tests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt -no-opengl -linuxfb --xcb=no -tslib --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -I/home/Qt/tslib-1.21/arm-tslib/include -L/home/Qt/tslib-1.21/arm-tslib/lib -recheck-all
上述的配置文本,可通过./configure -help查看对应的意思。
参考链接:https://doc.qt.io/qt-5/configure-options.html
上述配置跳过了几个Qt模块,且使用linuxfb作为显示平台插件,为ARM32编译Qt跨平台开发环境。
(3)在终端使用make -j12编译构建Qt源码。
(4)在终端使用make installl命令将编译成功后的文件安装到-prefix参数指定的路径下。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !