在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 platform
为linuxfb
。
编译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
编译环境。
配置主机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
。最后,连接刚刚编译好的tslib
与alsa
即可。
在执行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 - C
与GCC - C++
两个编译器,分别命名为arm-linux-gnueabihf-gcc
与arm-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++的编译器为刚刚配置的。
接下来,点击Qt版本后面的Manage
按钮,点击右边的添加,选择一个qmake
可执行文件。我的在/home/wangyz/code/arm_install/qt5.12.8/bin/qmake
下,此处也可以使用Buildroot
的环境,只需要更改qmake
的路径即可。版本名称我取为Qt %{Qt:Version} ARMv7 32bit
。同样,回到构建套件界选项卡,选择刚刚添加的Qt版本。
这样,针对arm平台的构建套件便配置完毕。点击确定关闭选项窗口,在配置工程的界面勾上新增的Qt 5.12.8 ARMv7 32bit
套件并点击配置工程按钮,即可配置工程同时用于PC以及开发板。
可以先在左下角的目标选择按钮中选择PC端,点击运行按钮,即可看到Demo在PC端运行的效果。
如果编译过程报错,可能是因为未安装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
下的可执行文件复制到开发板,即可查看在开发板上运行的效果。
值得注意的是,若程序可以运行,但是没有字体显示,则需要拷贝一个ttf格式的字体到/lib/fonts/
下,重启程序,即可正确显示字体。或者,也可以在Buildroot的Qt编译设置中,选中fontconfig support
,再在Target packages → Fonts, cursors, icons, sounds and themes
中选择一款你喜欢的字体,将字体直接加入Buildroot生成的镜像中。