目录

在Linux下搭建嵌入式Qt交叉编译环境

Qt是嵌入式平台常用的GUI库,具有丰富的控件与开发资料。本文介绍如何在x86计算机上搭建ARM开发环境,并交叉编译ARM平台上运行的Demo。

准备

下载交叉编译器

下载Linaro公司推出的的arm-linux-gnueabihf-gcc交叉编译器,放入/opt目录下,具体安装过程可以参考为荔枝派Zero编译可启动Linux系统镜像,并安装编译所需的依赖:

sudo apt install autoconf automake libtool m4 pkg-config

配置Buildroot支持Qt

下载并配置Buildroot。我选择的是Buildroot 2020.2.10版本,这个版本支持的Qt版本为5.12.8

Target packages → Audio and video → alsa-util中,勾选上编译alsa-util,并选择需要的模块。我选中了alsactl alsamixer amixer aplay/arecord 这些模块。

接下来,在Target packages → Libraries → Hardware handling中勾选上tslib的支持。

最后,在Target packages → Graphic libraries and applications (graphic/text) → Qt5下选择需要的模块。我选择了qt5base gui module → widgets module gui module → linuxfb support GIF support JPEG support PNG support Enable Tslib support,并配置Default graphical platformlinuxfb

编译ALSA

buildroot2020.02/dl中解压Buildroot下载好的alsa-lib源码。Buildroot 2020.02所使用的alsa lib版本为1.2.1.2

tar -jxf alsa-lib-1.2.1.2.tar.bz2 -C ~/code/arm_source

对源码进行配置,然后编译并安装:

./configure --host=arm-linux-gnueabihf --disable-python \
--prefix=/home/wangyz/code/arm_install/alsa

make -j6 && make install

编译tslib

buildroot2020.02/dl中解压Buildroot下载好的tslib源码:

tar -xf tslib-1.21.tar.xz -C ~/code/arm_source

对源码进行配置,然后编译并安装:

./autogen.sh

./configure -host=arm-linux-gnueabihf \
-prefix=/home/wangyz/code/arm_install/tslib

make -j6 && make install

安装Qt

为了能够在x86计算机上开发并生成ARM平台的Qt程序,一共需要安装3份Qt:

  • x86架构的Qt,用于在x86主机上开发(使用Qt官方安装包直接安装二进制版本)
  • ARM架构的Qt,用于Qt程序在开发板上运行(使用Buildroot编译并放入开发板的根文件系统中)
  • x86架构的ARM编译环境,用于在x86主机上编译生成开发板上的Qt程序(使用Qt源码交叉编译得到,其包含一份与开发板上相同的环境以及在x86主机上运行的qmake

其中第二条的ARM架构的Qt已经在前面Buildroot中编译完成了,现在介绍剩下两种的安装方法。

在主机上安装Qt

从Qt官网上下载与Buildroot内置Qt版本相同的二进制安装包。这里我使用的是与Buildroot 2020.2.10内置Qt版本相同的5.12.8版本,可以从下载得到。

双击下载得到的qt-opensource-linux-x64-5.12.8.run文件,根据图形指引安装即可。不要忘记勾选安装源代码,我们将使用这个源代码编译x86架构的ARM编译环境。

https://img.yuanze.wang/posts/build-qt-embedded-linux/qt_install.png
勾选安装源码

配置主机Qt交叉编译环境

主机中的环境可以使用Buildroot编译时使用的环境或自行编译安装。

编译安装

从Qt的安装路径复制一份代码包到源码目录。

cp ~/Qt5.12.8/5.12.8/Src ~/code/arm_source/qt5.12.8 -r

由于使用了自定义的编译器,因此需要对Qt的编译脚本做出一些修改。打开qt5.12.8/qtbase/mkspeces/linux-arm-gnueabi-g++/qmake.conf,将其中所有的arm-linux-gnueabi改为arm-linux-gnueabihf

配置Makefile:

./configure -release -opensource -recheck-all \
-prefix /home/wangyz/code/arm_install/qt5.12.8 \
-no-opengl -nomake tests -nomake examples \
-xplatform linux-arm-gnueabi-g++ \
-I/home/wangyz/code/arm_install/tslib/include \
-L/home/wangyz/code/arm_install/tslib/lib \
-I/home/wangyz/code/arm_install/alsa/include \
-L/home/wangyz/code/arm_install/alsa/lib

其中,-opensource是编译开源版本的Qt,由于嵌入式CPU不含GPU,因此不需要OpenGL相关的功能,使用-no-opengl禁用Qt对于OpenGL的支持,同时也需要使用-nomake tests -nomake examples关闭对测试和示例程序的编译,因为其中会包含一些代码引用OpenGL导致整个项目编译失败。-xplatform是指定qmake所使用的编译方案,也就是前面修改的qtbase/mkspeces/linux-arm-gnueabi-g++/qmake.conf。最后,连接刚刚编译好的tslibalsa即可。

在执行configure脚本时,会询问是否同意协议,y回车同意即可。

This is the Qt Open Source Edition.
 
You are licensed to use this software under the terms of
the GNU Lesser General Public License (LGPL) version 3
or the GNU General Public License (GPL) version 2.
 
Type 'L' to view the GNU Lesser General Public License version 3 (LGPLv3).
Type 'G' to view the GNU General Public License version 2 (GPLv2).
Type 'y' to accept this license offer.
Type 'n' to decline this license offer.
 
Do you accept the terms of either license? y

配置完成后,编译并安装代码。这需要一段时间。

make -j12 V=s && make install
注意
在安装好之后就不要移动安装与源码位置了,qmake依赖绝对路径,若必须移动位置,可以修改qmake的配置文件或者重新编译,这里不详细展开。

使用Buildroot提供的环境

Buildroot编译Qt的过程中,自然也需要一套交叉编译环境。若不愿自己再编译一遍交叉编译环境,可以直接使用Qt编译过程中所使用的环境。Buildroot目录下的output/build/qt5base-5.12.8/qmake/qmake即为所需要的交叉编译环境。

警告
Buildroot所使用的环境随着清理等操作,存在失效的风险。

在开发板上运行Demo

完成上述步骤,我们已经有了一套完整的的开发环境。接下来,可以打开Qt Creator尝试编译一个Demo并下载到开发板运行了。

打开Qt Creator,打开一个实例。这里我选择Animated Tiles Example作为示例。

打开项目后,首先需要对项目进行配置。默认的项目已经配置好了在PC上运行的环境,现在需要将适用于arm的构建套件加入。点击Manage Kits...按钮,进入构建套件配置。在配置中,可以看到自动检测到了PC上的构建套件。点击右边的添加按钮,新建一个配置。配置的名称可以随便填写,这里我填写Embedded Qt %{Qt:Version} ARMv7 32bit,设备类型选择通用Linux设备

接下来配置编译器与qmake。可以看到,上图中编译器仍为x86的编译器,点击右边的Manage按钮,然后分别点击右边的添加按钮,分别添加GCC - CGCC - C++两个编译器,分别命名为arm-linux-gnueabihf-gccarm-linux-gnueabihf-g++,并分别指向/opt/arm-linux-gnueabihf-gcc/bin/arm-linux-gnueabihf-gcc/opt/arm-linux-gnueabihf-gcc/bin/arm-linux-gnueabihf-g++。然后回到构建套件选项卡,分别选择C与C++的编译器为刚刚配置的。

https://img.yuanze.wang/posts/build-qt-embedded-linux/qt_compiler_config.png
添加编译器

接下来,点击Qt版本后面的Manage按钮,点击右边的添加,选择一个qmake可执行文件。我的在/home/wangyz/code/arm_install/qt5.12.8/bin/qmake下,此处也可以使用Buildroot的环境,只需要更改qmake的路径即可。版本名称我取为Qt %{Qt:Version} ARMv7 32bit。同样,回到构建套件界选项卡,选择刚刚添加的Qt版本。

https://img.yuanze.wang/posts/build-qt-embedded-linux/qt_kit_config.png
添加构建套件

这样,针对arm平台的构建套件便配置完毕。点击确定关闭选项窗口,在配置工程的界面勾上新增的Qt 5.12.8 ARMv7 32bit套件并点击配置工程按钮,即可配置工程同时用于PC以及开发板。

https://img.yuanze.wang/posts/build-qt-embedded-linux/qt_project_config.png
配置工程

可以先在左下角的目标选择按钮中选择PC端,点击运行按钮,即可看到Demo在PC端运行的效果。

https://img.yuanze.wang/posts/build-qt-embedded-linux/animatedtiles.png
Animated Tiles演示

如果编译过程报错,可能是因为未安装OpenGL支持,可以使用下面的命令安装。

sudo apt install libgl1-mesa-dev

然后,再选择arm_v7的目标,点击编译(没有配置开发板的远程连接,因此无法直接运行),待构建完毕生成可执行文件后,将/home/wangyz/Qt5.12.8/Examples/Qt-5.12.8/widgets/animation/build-animatedtiles-Embedded_Qt_5_12_8_ARMv7_32bit-Release下的可执行文件复制到开发板,即可查看在开发板上运行的效果。

https://img.yuanze.wang/posts/build-qt-embedded-linux/qt_target_arm.png
选择arm_v7作为目标

值得注意的是,若程序可以运行,但是没有字体显示,则需要拷贝一个ttf格式的字体到/lib/fonts/下,重启程序,即可正确显示字体。或者,也可以在Buildroot的Qt编译设置中,选中fontconfig support,再在Target packages → Fonts, cursors, icons, sounds and themes中选择一款你喜欢的字体,将字体直接加入Buildroot生成的镜像中。

https://img.yuanze.wang/posts/build-qt-embedded-linux/animatedtiles_target.gif
在开发板上运行的效果