zl程序教程

您现在的位置是:首页 >  系统

当前栏目

【正点原子FPGA连载】第十章Petalinux构建Qt和OpenCV交叉编译开发环境 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

LinuxOpencvQt嵌入式开发 环境 指南 构建
2023-09-11 14:20:38 时间

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第十章Petalinux构建Qt和OpenCV交叉编译开发环境

如果读者用过2019.1之前的Petalinux,会知道在设置Petalinux工作环境变量后可以直接使用arm或aarch64的linux交叉编译工具链,然而此后的Petalinux版本包括我们当前使用的Petalinux在设置环境变量后只能得到裸机的交叉编译工具链,而无法获得linux交叉编译工具链,所以本章以构建Qt和OpenCV交叉编译开发环境为例讲解如何获得linux交叉编译工具链。

10.1简介

10.1.1Petalinux的交叉编译工具链

交叉编译是编译技术发展过程中的一个重要分支。通俗的说,交叉编译就是在一个平台上生成另一个平台上的可执行代码。这里提到的平台有两方面的含义:处理器的体系结构和所运行的操作系统。
通常,程序是在一台计算机上编译,然后再分布到将要使用的其它计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。嵌入式系统应用的日益广泛和需求推动了交叉编译技术的发展。嵌入式系统开发,一般都是基于X86的PC平台进行,如果开发非X86的嵌入式系统,由于嵌入式系统资源的匮乏,交叉编译几乎是唯一手段。嵌入式系统中的应用程序都是通过交叉编译得到的。
我们使用Petalinux工具编译,显示Petalinux工具是带有交叉编译工具链的。设置Petalinux的工作环境后,输入“aa”,然后按TAB键,会显示当前环境中,以“aa”开头的工具和命令,包括交叉编译的工具和命令,如下图所示:
在这里插入图片描述

图 10.1.1以“aa”开头的工具和命令
其中以aarch64开头的是aarch64的交叉编译工具链,显示的aarch64交叉编译工具链只有none,也就是裸机下的交叉编译工具链,不能编译linux,那么用于linux的交叉编译工具链是啥样的呢,如下图所示:
在这里插入图片描述

图 10.1.2 用于linux的交叉编译工具链
是以aarch64-xilinx-linux开头的。如果我们想编译linux内核或linux应用就可以用其中的aarch64-xilinx-linux-gcc进行编译。既然设置Petalinux工作环境没有,那么Petalinux是怎么构建linux系统的呢?其实Petalinux在构建linux系统过程中会编译生成linux交叉编译工具链,然后使用其构建linux系统,可以在Petalinux工程下使用“find . -name “aarch64-xilinx-linux-gcc””命令找到相应的痕迹。不过这种构建过程中编译生成的linux交叉编译工具链是不方便使用的,而且其功能完整性还不能得到保证,毕竟我们不知道Petalinux在构建完成后会怎么处理这些中间件。那么怎么才能获得实用的linux编译工具链呢?这就是本章的重点了。因为有了linux交叉编译工具链就可以摆脱对Petalinux的依赖,直接使用linux交叉编译工具链进行编译,方便快捷。
由于获取linux编译工具链需要用Petalinux构建SDK,然后安装SDK,为了避免后面开发Qt和OpenCV时重新构建安装SDK,所以本章我们就将Qt和OpenCV也打包进SDK。所谓的SDK,也就是软件开发工具集,与Petalinux构建的根文件系统息息相关,里面不仅包含有Petalinux构建的根文件系统,各种库和头文件,还包含linux交叉编译工具链,用来编译linux内核及linux应用以使其能在ZYNQ MPSoc的PS上运行。
10.1.2Qt简介
Qt是一个跨平台的C++图形用户界面应用程序开发框架。它既可以开发GUI图形用户界面程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器 (Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
Qt是一个完整的开发框架,其目的旨在简化桌面、嵌入式和移动平台的应用程序和用户界面的创建。Qt除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等。
大部分应用程序都可以使用Qt实现,除了与计算机底层结合特别紧密的,例如驱动开发,它直接使用硬件提供的编程接口,而不能使用操作系统自带的函数库。
由于Qt良好的跨平台特性,基本上不做修改就可以在Linux上实现同样的界面。Linux操作系统是嵌入式的主力军,广泛应用于消费类电子、工业控制、军工电子、电信‍/‍网络‍/‍通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。
除了Qt的跨平台特性和功能丰富外,笔者选择Qt的另一个原因是开源。Qt有商业版和开源版(使用GPL和LGPL开源协议),开源版Qt足以满足一般需求。关于Qt不同许可证模式和开发平台下的不同特性,可访问该网页:https://www.qt.io/cn/product/features。进入该网页后,点击左侧的选择菜单,选择对应的许可证模式和开发平台后,右侧会显示支持的特性,不支持的特性会变灰。
在这里插入图片描述

图 10.1.3 Qt版本特性
开发Qt需要搭建Qt开发环境。Qt有自己的集成开发环境——Qt Creator。Qt Creator是一个跨平台的、完整的Qt集成开发环境(IDE),其中包括了高级C++代码编辑器、项目和生成管理工具、集成的上下文相关的帮助系统、图形化调试器、代码管理和浏览工具等。与常见的IDE不同的是,Qt Creator本身是一个空壳,不包含编译器和Qt库,所以后面还需要配置Qt Creator。
由于使用Qt的人很多,市面上关于Qt的教程也很多,入门的、深入的都有,所以本章就不浪费时间讲解如何安装Qt了,读者可自行上网搜索Qt的安装,也可阅读本章扩展阅读部分的“安装Qt”。
10.1.3OpenCV简介
OpenCV全称 Open Source Computer Vision Library,是一个开源的计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法,我们可以调用它提供的各种 API 接口对图像进行算法处理,例如图像模糊处理、边缘检测、滤波以及人脸识别等相关应用场景,笔者对此并不是很了解,大家有兴趣的话可以在网上百度 get 这些知识。
OpenCV基于 BSD 协议,因此它可免费用于学术和商业用途,其提供 C++、C、Python 和 Java 接口,支持 Windows、Linux、Mac OS、iOS 和 Android 等多种操作系统。
OpenCV提供了丰富的API可简化我们对图像处理相关的编程工作,同样这些API也是封装成链接库的形式,可以是动态链接库(Dynamic link library)或者静态链接库(Static link library);对于嵌入式Linux系统来说,我们需要通过交叉编译将OpenCV源码编译成可适用于ARM平台的链接库文件,那么如何获取适用于ARM平台的链接库文件呢?
答案是可以使用Petalinux构建,通过定制根文件系统的方式将OpenCV库添加到根文件系统中,这样就获取到了用于我们开发板的链接库文件。
10.2定制根文件系统rootfs
前面介绍了SDK与Petalinux构建的根文件系统息息相关,这是因为SDK中包含了根文件系统,而根文件系统中又包含了我们添加的各种各样的软件库,特别是链接库,我们在电脑主机中开发编译Qt或OpenCV时就需要这些链接库。下面我们定制本章的根文件系统。
进入到第六章Petalinux设计流程实战中创建的petalinux工程目录下,然后按照6.3.2小节设置Petalinux环境变量。输入如下命令配置根文件系统:
petalinux-config -c rootfs
执行结果如下图所示:
在这里插入图片描述

图 10.2.1 根文件系统配置界面
下面定制本章需要的根文件系统。(在第九章的基础上定制)
10.2.1添加Qt
添加Qt需要对如下配置项进行配置:
Petalinux Package Groups —>
packagegroup-petalinux-qt —>
packagegroup-petalinux-qt(Y)
populate_sdk_qt5(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.2 添加qt
“packagegroup-petalinux-qt”中包含了linux系统使用Qt需要的基本包。移动到“packagegroup-petalinux-qt”,然后用界面下方的“< Help >”查看其含义,也可以按下键盘上的H键,结果如下图所示:
在这里插入图片描述

图 10.2.3包含的Qt包
可以看到“packagegroup-petalinux-qt”中包含了Qt的基本包有哪些。“populate_sdk_qt5”表示包含Qt5主机工具链,同样可以用< Help >查看其含义。
其中的dev和dbg应该对应着开发和调试,由于没有具体说明,此处就不配置了。
对于Qt,还有一个Qt扩展“qt-extended”的包组,名为packagegroup-petalinux-qt-extended,此处笔者没有添加该包组,有需要的读者可自行添加。
10.2.2添加OpenCV
添加OpenCV需要对如下配置项进行配置:
Petalinux Package Groups —>
packagegroup-petalinux-opencv —>
packagegroup-petalinux-opencv(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.4 添加OpenCV
packagegroup-petalinux-opencv包含着linux系统使用opencv需要用到的基本库,可以用< Help >查看,结果如下图所示:
在这里插入图片描述

图 10.2.5 packagegroup-petalinux-opencv中的包
10.2.3添加Python
当今社会,随着深度学习及AI的兴起,使用Python的人越来越多,在根文件系统中必然不可缺少对Python的支持,添加Python需要对如下配置项进行配置:
Petalinux Package Groups —>
packagegroup-petalinux-python-modules —>
packagegroup-petalinux-python-modules(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.6添加Python
用< Help >可以看到packagegroup-petalinux-python-modules包含如下Python工具包:
在这里插入图片描述

图 10.2.7包含的Python工具包
10.2.4添加视频工具库v4lutils(可选)
如果想使用开发板对视频进行采集开发等,可以添加视频工具库v4lutils。添加视频工具库v4lutils需要进行如下配置:
Petalinux Package Groups —>
packagegroup-petalinux-v4lutils —>
packagegroup-petalinux-v4lutils(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.8 添加多媒体库
用< Help >可以看到packagegroup-petalinux-multimedia包含如下包:
在这里插入图片描述

图 10.2.9包含的多媒体库
笔者未使用过,就不介绍了。
10.2.5添加音频库audio(可选)
要想添加对音频的操作,可以添加音频库audio。添加音频库需要进行如下配置:
Petalinux Package Groups —>
packagegroup-petalinux-audio —>
packagegroup-petalinux-audio(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.10 添加多媒体库
用< Help >可以看到packagegroup-petalinux-audio包含如下包:
在这里插入图片描述

图 10.2.11包含的音频工具库
由于添加音频库会使根文件系统变大、且不是每个人都需要的,所以是可选,此处介绍是让读者知道有这么个东西。
10.2.6添加gcc编译工具链(可选)
要想在开发板上直接编译C/C++源码,可以添加gcc编译工具链,也就是packagegroup-petalinux-self-hosted,self-hosted直译就是自主机的,也就是把开发板当作主机来开发使用。添加packagegroup-petalinux-self-hosted需要进行如下配置:
Petalinux Package Groups —>
packagegroup-petalinux-self-hosted —>
packagegroup-petalinux-self-hosted(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.12 添加编译工具链
用< Help >可以看到packagegroup-petalinux-self-hosted包含如下包:
在这里插入图片描述

图 10.2.13 包含的包
packagegroup-self-hosted中包含着gcc编译工具链;对于whetstone,笔者查到的信息好像是一种性能测试工具;vim,相信不需要笔者进行介绍了,linux中一种流行的文本编辑器。
注意该包是可选的,添加会增大根文件系统的大小,需要的话可以添加。
10.2.7添加utils工具(可选)
要想丰富根文件系统的一些常用工具,如查看cpu频率等,可以添加utils工具包,需要进行的配置如下:
Petalinux Package Groups —>
packagegroup-petalinux-utils —>
packagegroup-petalinux-utils(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.14 添加多媒体库
用< Help >可以看到packagegroup-petalinux-utils包含如下包:
在这里插入图片描述

图 10.2.15包含的utils工具
10.2.8添加网络工具(可选)
要想丰富根文件系统的网络相关方面的功能,如访问mdio寄存器等,可以添加网络栈包networking-stack,需要进行的配置如下:
Petalinux Package Groups —>
packagegroup-petalinux-networking-stack —>
packagegroup-petalinux-networking-stack(Y)
结果如下图所示:
在这里插入图片描述

图 10.2.16 添加多媒体库
用< Help >可以看到packagegroup-petalinux-networking-stack包含如下包:
在这里插入图片描述

图 10.2.17包含的网络工具
10.2.9添加GPU库(可选)
配置rootfs来构建用于在GPU上运行图形应用程序的mali.ko。
Filesystem Packages —>
libs —>
libmali-xlnx —>
[*] libmali-xlnx
结果如下图所示:
在这里插入图片描述

图 10.2.18 添加GPU库
“mali-backend-defaults (x11)”表示mali的后端是x11,也可以选择其他的后端,可选的后端如下:
在这里插入图片描述

图 10.2.19 默认后端选择
配置完成后,保存配置并退出。
10.3编译根文件系统并构建SDK
使用如下命令编译刚才定制的根文件系统:
petalinux-build -c rootfs
结果如下图所示:
在这里插入图片描述

图 10.3.1 编译根文件系统
Petalinux工程编译生成的根文件系统在images/linux/目录下。
构建SDK的命令如下:
petalinux-build --sdk
该命令可构建SDK并将其部署在当前Petalinux工程的images/linux/sdk.sh中。
注:笔者不推荐读者自己构建SDK,一是因为由于Petalinux本身bug的原因会出现一些ERROR,有些ERROR不好解决,二是构建SDK太耗硬盘空间。推荐使用我们提供的已经构建好的SDK文件,路径为资料盘A盘:4_SourceCode\3_Embedded_Linux\资源文件\sdk.sh。
构建时可能会出现如下图所示的错误:
在这里插入图片描述

图 10.3.2 出现的错误
错误的原因是缺失了包unfs3,而且由于BB_NO_NETWORK的原因不能联网下载。如果访问错误中的网页http://petalinux.xilinx.com/sswreleases/rel-v2020/downloads/git2_github.com.unfs3.unfs3.git.tar.gz会发现也是不能下载,这可能是Xilinux在打包“下载”时可能出现的缺漏。
解决的方法也很简单,配置Petalinux工程,让其可以联网下载,命令如下:
petalinux-config
进入到Yocto Settings界面,取消使能BB_NO_NETWORK,如下图所示:
在这里插入图片描述

图 10.3.3取消使能BB_NO_NETWORK
保存配置并退出。
现在继续构建SDK,结果如下图所示:
在这里插入图片描述

图 10.3.4 构建SDK
可以看到是将之前的ERROR变成了WARNING,并未从根本上解决问题。从编译根文件系统没问题而构建SDK有问题来看,可能是Petalinux的一个bug。定制根文件系统时添加的包越多,就越会出现一些奇怪的错误,因而推荐读者在构建SDK之前尽可能少的添加包到根文件系统中,以避免产生无法解决或很难解决的错误,在构建SDK完成后,再定制根文件系统将之前未添加的包或工具添加到根文件系统中。
注:笔者最终发现缺失的unfs3包可访问该网站进行下载:http://downloads.yoctoproject.org/mirror/sources/git2_github.com.unfs3.unfs3.git.tar.gz,将下载下来的包放到错误!未找到引用源。下,然后重新构建,问题即可解决。如果读者在构建SDK时出现其他的ERROR,请使用我们提供的已经构建好的SDK文件,路径为资料盘A盘:4_SourceCode\3_Embedded_Linux\资源文件\sdk.sh。
成功构建的SDK文件在工程的images/linux目录下,名为sdk.sh,如下图所示:
在这里插入图片描述

图 10.3.5构建的SDK文件
可以看到构建的SDK文件是一个脚本文件,需要执行才能使用,也就是安装sdk。命令如下:
cd images/linux/
./sdk.sh
首先进入到当前Petalinux工程的images/linux目录下,然后执行sdk.sh进行安装,结果如下图所示:
在这里插入图片描述

图 10.3.6 安装sdk
如果使用的是网盘提供的sdk.sh文件,需要先将其拷贝到Ubuntu系统中,然后执行sdk.sh进行安装。
默认是安装在/opt/petalinux/2019.2目录下,如果想安装在其他目录下,可以输入相应的路径,此处笔者保持默认,按回车键继续,结果如下图所示:
在这里插入图片描述

图 10.3.7 安装sdk成功
再次确认是否将SDK安装在/opt/petalinux/2019.2目录下,默认为“Y”,也就是“是”,按回车键继续往下执行安装。等待安装完成,安装完成后提示在一个新终端中使用SDK前需要先执行“. /opt/petalinux/2019.2/environment-setup-aarch64-xilinx-linux”以设置相应的环境变量,其中的“.”和source具有相同含义。
10.4SDK中的Qt和OpenCV库
安装完成之后,我们进入到安装目录/opt/petalinux/2019.2下,该目录下有一些文件和文件夹,如下所示:
在这里插入图片描述

图 10.4.1 SDK安装目录下的文件
该目录下有一个环境变量配置文件environment-setup-aarch64-xilinx-linux,每次使用之前都需要使用source来运行这个配置文件,例如:
source environment-setup-aarch64-xilinx-linux
当SDK环境变量配置完成之后,我们可以在终端输入aarch,然后连按三次TAB键查看交叉编译相关的命令,如果配置成功则会显示如下信息,表示环境变量已经配置成功了:
在这里插入图片描述

图 10.4.2 查看交叉编译工具集
此时,我们就得到了linux交叉编译工具链,可以摆脱Petalinux,直接使用linux交叉编译工具链编译uboot、linux内核和linux应用。
文件夹sysroots/aarch64-xilinx-linux下存放的是我们本章构建的根文件系统,如下图所示:
在这里插入图片描述

图 10.4.3 根文件系统
该根文件系统可直接用于我们的开发板。
在sysroots/aarch64-xilinx-linux/usr/lib目录下有很多的库文件,其中就包含了Qt相关的链接库以及OpenCV相关的链接库文件,如下所示:
在这里插入图片描述

图 10.4.4 Qt 链接库文件
在这里插入图片描述

图 10.4.5 OpenCV 链接库文件
10.5设置SDK的工作环境
在正式使用SDK之前,需要先设置SDK的工作环境,在终端输入如下命令即可:
. /opt/petalinux/2019.2/environment-setup-aarch64-xilinx-linux
执行结果如下图所示:
在这里插入图片描述

图 10.5.1 设置SDK工作环境
设置完SDK的工作环境后,就可以获得linux交叉编译工具链,如图 10.4.2所示。不过使用的时候并不是直接使用交叉编译工具链,而是使用 C C 和 {CC}和 CC{LD}两个环境变量(可以简写成 C C 和 CC和 CCLD),如下图所示:
在这里插入图片描述

图 10.5.2 CC和LD的环境变量定义
可以看到 C C 环境变量是带参数的 a a r c h 64 − x i l i n x − l i n u x − g c c 交叉编译工具链的定义,特别是其中的 s y s r o o t 参数,没有该参数,直接使用 a a r c h 64 − x i l i n x − l i n u x − g c c 编译 C 源文件会报错。这就是为何不能直接使用 a a r c h 64 − x i l i n x − l i n u x − g c c ,而是需要使用 CC环境变量是带参数的aarch64-xilinx-linux-gcc交叉编译工具链的定义,特别是其中的sysroot参数,没有该参数,直接使用aarch64-xilinx-linux-gcc编译C源文件会报错。这就是为何不能直接使用aarch64-xilinx-linux-gcc,而是需要使用 CC环境变量是带参数的aarch64xilinxlinuxgcc交叉编译工具链的定义,特别是其中的sysroot参数,没有该参数,直接使用aarch64xilinxlinuxgcc编译C源文件会报错。这就是为何不能直接使用aarch64xilinxlinuxgcc,而是需要使用CC的原因,所以后面需要编译用于开发板上的C程序源码文件时,应使用如下方式编译:
$CC c源码文件
#或者
$CXX c++源码文件
C X X 环境变量是带参数的 a a r c h 64 − x i l i n x − l i n u x − g + + 交叉编译工具链的定义,可直接用于编译 C + + 程序源码文件。调试工具为 a a r c h 64 − x i l i n x − l i n u x − g d b ,对应的环境变量为 CXX环境变量是带参数的aarch64-xilinx-linux-g++交叉编译工具链的定义,可直接用于编译C++程序源码文件。 调试工具为aarch64-xilinx-linux-gdb,对应的环境变量为 CXX环境变量是带参数的aarch64xilinxlinuxg++交叉编译工具链的定义,可直接用于编译C++程序源码文件。调试工具为aarch64xilinxlinuxgdb,对应的环境变量为GDB,这些交叉编译工具的路径可以通过whereis命令查看,如输入“whereis aarch64-xilinx-linux-gdb”,可查看aarch64-xilinx-linux-gdb的路径,如下图所示:
在这里插入图片描述

图 10.5.3 查看交叉编译工具路径
注:每打开一个新的终端,需要重新设置SDK工作环境。当前终端中的设置只在当前终端有效。
10.6配置Qt Creator
要想用QT Creator开发用于开发板的Qt demo需要配置QT Creator。在Ubuntu系统中打开QT Creator(如果没有安装QT Creator,请阅读本章扩展阅读部分的“安装Qt”)
在这里插入图片描述

图 10.6.1 QT Creator
打开QT Creator后,QT Creator界面如下图所示:
在这里插入图片描述

图 10.6.2 QT Creator界面
现在开始配置QT Creator。如图 10.6.3所示,点击QT Creator菜单栏的“工具(Tools)”菜单,在弹出的菜单中点击“选项(Options)…”以打开配置选项界面。
在这里插入图片描述

图 10.6.3 打开配置选项
打开的配置选项界面如下图所示:
在这里插入图片描述

图 10.6.4 选项界面
1、配置编译器(Compilers)
配置编译器也就是配置linux交叉编译工具aarch64-xilinx-linux-gcc和aarch64-xilinx-linux-g++。
点击左侧栏中的“Kits”,然后点击右侧的“编译器”配置项,可以看到Qt Creator自动检测到系统中的C和C++编译器(Auto-detected选项下),如下图所示:
在这里插入图片描述

图 10.6.5 Compilers 配置项
这个页面用于配置Qt Creator编译代码时所使用的编译工具。
从“Auto-detected”列举出来的编译工具信息可以知道GCC的路径都是在Ubuntu系统的/usr/bin目录中,且都是用于64位的x86架构的CPU,用这些编译工具编译出来的代码只能在Ubuntu虚拟机上运行。
上图中“Manual”选项下的编译工具需要手动添加,点击右边的添加,在下拉的菜单栏中依次选择GCC->C,如下图所示:
在这里插入图片描述

图 10.6.6 手动添加编译工具
点击之后,在出现的属性栏中,修改编译器名称为zynqmp_GCC,编译器路径点击浏览,选择“/opt/petalinux/2019.2/sysroots/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-gcc”,如下图所示。完成后同样的方法添加C++编译器,编译器名称修改为zynqmp_G++,路径为“/opt/petalinux/2019.2/sysroots/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-g++”。
在这里插入图片描述

图 10.6.7修改编译器名称和路径
从“Manual”选项下添加的编译工具信息可以知道“Manual”栏下的GCC都是用于64位的arm。我们展开“Manual”,可以看到更完整的信息,如下图所示:
在这里插入图片描述

图 10.6.8交叉编译工具
在这里插入图片描述

图 10.6.9交叉编译工具
从GCC的路径信息可以知道,安装路径来自/opt/petalinux/2019.2/,也就是SDK安装路径是我们本章构建的linux交叉编译工具aarch64-xilinx-linux-gcc和aarch64-xilinx-linux-g++。
2、配置 Debuggers
配置Debuggers,也就是配置调试工具aarch64-xilinx-linux-gdb。
点击右边的Debuggers选项卡切换到该页面,如下所示:
在这里插入图片描述

图 10.6.10 配置 Debuggers
该配置项用于配置Qt程序的调试工具,具体的调试方法笔者也未曾使用过,所以调试方法这里就不给大家介绍了。点击右边菜单Add添加新的debugger,如下所示:
在这里插入图片描述

图 10.6.11 配置gdb交叉编译工具
在“Name”栏设置调试工具的名字,例如“zynqMP_gdb”,在“path”栏选择调试工具的路径,也就是配置aarch64-xilinx-linux-gdb工具的路径。配置SDK的工作环境后,可以通过whereis命令得到,路径为sdk安装目录/sysroots/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-gdb ,例如笔者的sdk安装目录为/opt/petalinux/2019.2,所以路径为/opt/petalinux/2019.2/sysroots/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-gdb。
配置完成之后点击“Apply”应用按钮。
3、配置 Qt Versions
点击左边的Qt Versions选项卡切换到该页面,如下所示:
在这里插入图片描述

图 10.6.12 Qt Versions 配置界面
该配置界面用于配置qmake工具的路径,这里简单地介绍一下Qt程序的编译过程,大致可以分为以下三个步骤:

  1. 使用qmake-project生成与平台无关的pro文件;
  2. 利用pro文件生成与平台相关的 Makefile 文件。Makefile 文件关系到整个工程的编译规则,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,文件之间的依赖关系,甚至于进行更复杂的功能。而在Qt Creator 中,使用qmake工具自动生成 Makefile 文件。
  3. 使用make命令完成自动编译,make就是通过解析Makefile文件的内容来执行编译工作的,会为每个源文件生成一个对应的.o文件,最后将目标文件链接生成最终的可执行文件。
    点击右边“添加(Add)…”按钮添加一个qmake工具,配置其名字以及路径等信息。当我们点击Add按钮的时候就会弹出qmake路径配置对话框,使用到的qmake工具路径为sdk安装目录/sysroots/x86_64-petalinux-linux/usr/bin/qmake,如下所示:
    在这里插入图片描述

图 10.6.13 配置qmake
“Name”栏的“Qt %{Qt:Version}(System)”可以改为其他名字,也可以不改,此处笔者改为“Qt %{Qt:Version}(zynqMP)”,方便辨认。
从上图可以看到,Petalinux使用的Qt版本为5.11.3。
配置完成点击“Apply”应用按钮。
4、配置Kits
点击上边的 Kits 选项卡切换到该页面,如下所示:
在这里插入图片描述

图 10.6.14Kits 配置界面
点击右边“添加(Add)”按钮添加一个Kit。Kit其实就是对前面的各个配置项进行打包,变成一个Kit套件,而当我们使用Qt Creator创建Qt工程的时候会选择一个Kit套件,并基于它创建我们的工程。上图中的“Auto-detected”列表下已经存在一个配置好的Kit套件Desktop Qt 5.14.2 GCC 64bit,从名字可以知道,该Kit适用于创建在Ubuntu桌面系统上运行的Qt程序,所以不能用于创建一个能够在ZYNQ MPSoC开发板上运行的Qt程序,所以这里需要添加一个新的Kit。
点击右边“添加(Add)”按钮添加新的Kit,如下图所示:
在这里插入图片描述

图 10.6.15 配置zynqMP Kit套件
在第一栏的Name栏为Kit套件命名,例如zynqMP。
Device type:选择设备的类型,这里有四个选择项,分别为Desktop(PC机)、Android Device(安卓设备)、Generic Linux Device(通用Linux设备)和 QNX Device(QNX设备);对于ZYNQ MPSoC来说,选择Generic Linux Device。
Sysroot:系统镜像的根目录,为SDK安装路径下的sysroots/aarch64-xilinx-linux文件夹。
Compiler C:选择SDK安装路径下的linux交叉编译工具aarch64-xilinx-linux-gcc。
Compiler C++:选择SDK安装路径下的linux交叉编译工具aarch64-xilinx-linux-g++。
Debugger选择zynqMP_gdb,
Qt version选择 Qt 5.11.3(zynqMP)
配置完成之后点击“Apply”应用,可以看到上边zynqMP名字前面有一个黄色感叹号,这是一个警告信息,原因在于我们配置了Device type,而没有配置 Device,这个后面有用到的时候再跟大家讲。
点击“OK”按钮配置完成退出界面,至此我们的Qt Creator就配置完成了。下一节我们将对前面所做的配置工作进行测试。

10.7搭建Qt测试工程

点击Qt Creator的菜单栏File -> New File or Project(或者直接使用快捷键 Ctrl + N)打开工程创建面板,如下所示:
在这里插入图片描述

图 10.7.1 工程创建面板
左边选择工程类型,这里我们选择的是一个Application(Qt)应用程序,右边选择工程模板,这里我们选择Qt Widgets Application,点击“Choose…”按钮进入下一步。
设置qt工程名和路径,如下图所示:
在这里插入图片描述

图 10.7.2 设置qt工程名和路径
在Name栏中设置qt工程名为“qt_test”,工程路径任意,此处选择/home/shang/workspace/qt,路径必须要存在,不然会报错。
设置完成之后点击“下一步(Next)”按钮进入下一步,如下图所示:
在这里插入图片描述
在这里插入图片描述

图 10.7.3 选择构建工具
“Build system”默认为qmake,此处保持默认即可。点击“Next”按钮进入下一步,如下图所示:
在这里插入图片描述

图 10.7.4 配置工程的类
保持默认配置,直接点击“Next”按钮进入下一步,如下图所示:
在这里插入图片描述

图 10.7.5 选择语言
同样保持默认配置,直接点击“Next”按钮进入下一步,如下图所示:
在这里插入图片描述

图 10.7.6选择 Kit
前面介绍过,在创建Qt应用程序的时候需要选择Kit,并基于该Kit创建我们的工程。由于本小节是测试之前配置的QT Creator能否正常工作,所以这里选择“zynqMP”。点击“下一步(Next)”按钮进入下一步,如下图所示:
在这里插入图片描述

图 10.7.7 配置总结
直接点击“完成”按钮完成工程创建。工程创建完成之后,如下所示:
在这里插入图片描述

图 10.7.8 工程界面
此时双击左边文件列表Forms中的mainwindow.ui 文件,打开 Qt Creator 的图形化编程界面,如下所示:
在这里插入图片描述

图 10.7.9 Qt Design 图形化编程界面
这是Qt Creator中集成的Qt Design图形化编程工具,左边栏显示了Qt所支持的控件,中间显示GUI控件编程、布局界面,而右边界面显示了Qt控件所支持的各种属性,可以对其进行修改。
图 10.7.10中笔者随便拖入几个控件,包括一个日历控件Calendar Widget、一个按钮控件Push Button 以及一个Label控件,并对它们进行了简单地布局、调整、修改了Label控件的显示的文字内容和大小(选中Label控件,可以在右下角列出的属性表中找到对应的设置项),如下图所示:
在这里插入图片描述

图 10.7.10 搭建qt界面
Qt工程编程完成后使用Ctrl+S快捷键进行保存,然后点击左下角的小锤子按钮编译工程,如下所示:
在这里插入图片描述

图 10.7.11 编译工程
编译过程中可以点击下方的“编译输出(Compile Output)”按钮查看编译输出信息,如下所示:
在这里插入图片描述

图 10.7.12 编译输出信息
从打印信息可以知道,当编译Qt程序的时候编译器会链接到相关的库文件,例如libQt5Widgets.so、libQt5Gui.so、libQt5Core.so等,没有任何的错误打印信息,但是有一个警告信息,编译成功。
警告信息不影响程序的运行。如果想解决警告信息,可以点击上图中2处的/opt/petalinux/2020.2/sysroots/aarch64-xilinx-linux/usr/include/features.h,点击后Qt Creator会自动打开该文件,可以看到警告信息是该文件的第382行输出的,解决的方法也很简单,在该文件的第380行下添加“# define OPTIMIZE 1”,如下图所示:
在这里插入图片描述

图 10.7.13 解决警告
添加完成后保存该文件。
现在编译工程就不会出现警告信息了。由于之前已经编译过了,需要改动工程,才能重新编译,可以稍微改动图 10.7.10 的qt界面,然后重新编译。
编译成功之后不能直接点击Qt Creator右下角的绿色小三角按钮运行 Qt 程序,因为这个程序不能在Ubuntu系统下运行,我们需要将编译生成的可执行文件拷贝到开发板根文件系统目录中,然后在ZYNQ MPSoC开发板系统下运行。
打开Ubuntu终端,进入到Qt工程所在目录,如下:
在这里插入图片描述

图 10.7.14 Qt 工程所在目录
qt_test就是笔者创建的工程,build-qt_test-zynqMP-Debug目录下存放的就是工程编译过程中所生成的文件,包括最终的可执行文件都在这个目录下,进入到该目录,如下图所示:
在这里插入图片描述

图 10.7.15 编译生成的文件
其中qt_test是最终的可执行文件,可以使用file命令查看该文件的属性,如下图所示:
在这里插入图片描述

图 10.7.16文件属性查看
由此可以知道该文件是一个ELF格式的可执行文件,可以运行在64位ARM架构的Linux 系统下,所以我们需要把该文件放置到开发板上运行。

10.8上板测试

按照9.5节制作BOOT.BIN启动文件并复制到SD卡,然后按照9.6节拷贝根文件系统到SD卡的ext4分区。需要注意的是在拷贝本章的根文件系统到SD卡的ext4分区之前,要先删除SD的ext4分区的内容,否则可能会出问题,删除命令要加sudo,如sudo rm -rf /media/cx/rootfs/*。拷贝本章的根文件系统到SD卡的ext4分区完成后,将上一节编译得到的qt_test复制到SD卡ext4分区的home/root目录中。
启动开发板后进入linux系统。设置Qt运行环境变量,(如果没有配置X11,环境变量使用export QT_QPA_PLATFORM=linuxfb)
export DISPLAY=:0.0
运行qt_test程序,如下图所示:
在这里插入图片描述

与开发板miniDP接口连接的显示器显示的内容如下图所示:
在这里插入图片描述

图 10.8.1 显示的qt界面
Qt界面是在上一章搭建的Matchbox桌面上显示的。在串口终端按Ctrl + C快捷键可结束程序运行。
10.9扩展阅读:
10.9.1安装Qt
为了防止有些读者没有找到好的Qt安装教程,此处推荐B站用户“他是个小白”的一个qt安装的视频:
Ubuntu使用清华源镜像安装Qt:https://www.bilibili.com/video/BV1nV411q7R5/?spm_id_from=333.788.b_636f6d6d656e74.15
注:不要安装Qt6版本,因为Qt6不支持Ubuntu18版本。