Qt是嵌入式平台常用的GUI库,具有丰富的控件与开发资料。本文介绍如何在x86
计算机上搭建ARM
开发环境,并交叉编译ARM
平台上运行的Demo。
下载Linaro公司推出的的arm-linux-gnueabihf-gcc
交叉编译器,放入/opt
目录下,具体安装过程可以参考为荔枝派Zero编译可启动Linux系统镜像,并安装编译所需的依赖:
|
下载并配置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
。
从buildroot2020.02/dl
中解压Buildroot
下载好的alsa-lib
源码。Buildroot 2020.02
所使用的alsa lib
版本为1.2.1.2
。
|
对源码进行配置,然后编译并安装:
|
从buildroot2020.02/dl
中解压Buildroot
下载好的tslib
源码:
|
对源码进行配置,然后编译并安装:
|
为了能够在x86
计算机上开发并生成ARM
平台的Qt程序,一共需要安装3份Qt:
x86
架构的Qt,用于在x86
主机上开发(使用Qt官方安装包直接安装二进制版本)ARM
架构的Qt,用于Qt程序在开发板上运行(使用Buildroot
编译并放入开发板的根文件系统中)x86
架构的ARM
编译环境,用于在x86
主机上编译生成开发板上的Qt程序(使用Qt源码交叉编译得到,其包含一份与开发板上相同的环境以及在x86
主机上运行的qmake
)其中第二条的ARM
架构的Qt已经在前面Buildroot
中编译完成了,现在介绍剩下两种的安装方法。
从Qt官网上下载与Buildroot
内置Qt版本相同的二进制安装包。这里我使用的是与Buildroot 2020.2.10
内置Qt版本相同的5.12.8
版本,可以从下载得到。
双击下载得到的qt-opensource-linux-x64-5.12.8.run
文件,根据图形指引安装即可。不要忘记勾选安装源代码,我们将使用这个源代码编译x86
架构的ARM
编译环境。
勾选安装源码
主机中的环境可以使用Buildroot
编译时使用的环境或自行编译安装。
从Qt的安装路径复制一份代码包到源码目录。
|
由于使用了自定义的编译器,因此需要对Qt的编译脚本做出一些修改。打开qt5.12.8/qtbase/mkspeces/linux-arm-gnueabi-g++/qmake.conf
,将其中所有的arm-linux-gnueabi
改为arm-linux-gnueabihf
。
配置Makefile:
|
其中,-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
回车同意即可。
配置完成后,编译并安装代码。这需要一段时间。
|
注意
在安装好之后就不要移动安装与源码位置了,qmake
依赖绝对路径,若必须移动位置,可以修改qmake的配置文件或者重新编译,这里不详细展开。
在Buildroot
编译Qt的过程中,自然也需要一套交叉编译环境。若不愿自己再编译一遍交叉编译环境,可以直接使用Qt编译过程中所使用的环境。Buildroot
目录下的output/build/qt5base-5.12.8/qmake/qmake
即为所需要的交叉编译环境。
警告
Buildroot
所使用的环境随着清理等操作,存在失效的风险。
完成上述步骤,我们已经有了一套完整的的开发环境。接下来,可以打开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端运行的效果。
Animated Tiles演示
如果编译过程报错,可能是因为未安装OpenGL
支持,可以使用下面的命令安装。
|
然后,再选择arm_v7
的目标,点击编译(没有配置开发板的远程连接,因此无法直接运行),待构建完毕生成可执行文件后,将/home/wangyz/Qt5.12.8/Examples/Qt-5.12.8/widgets/animation/build-animatedtiles-Embedded_Qt_5_12_8_ARMv7_32bit-Release
下的可执行文件复制到开发板,即可查看在开发板上运行的效果。
选择arm_v7作为目标
值得注意的是,若程序可以运行,但是没有字体显示,则需要拷贝一个ttf格式的字体到/lib/fonts/
下,重启程序,即可正确显示字体。或者,也可以在Buildroot的Qt编译设置中,选中fontconfig support
,再在Target packages → Fonts, cursors, icons, sounds and themes
中选择一款你喜欢的字体,将字体直接加入Buildroot生成的镜像中。
在开发板上运行的效果