本帖最后由 正点原子运营 于 2024-2-1 18:02 编辑
第十章 Petalinux构建Qt和OpenCV交叉编译开发环境
1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板
2) 章节摘自【正点原子】DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南 V1.0
6)Linux技术交流QQ群:887820935
如果读者用过2019.1之前的Petalinux,会知道在设置Petalinux工作环境变量后可以直接使用arm或aarch64的linux交叉编译工具链,然而此后的Petalinux版本包括我们当前使用的Petalinux在设置环境变量后只能得到裸机的交叉编译工具链,而无法获得linux交叉编译工具链,所以本章以构建Qt和OpenCV交叉编译开发环境为例讲解如何获得linux交叉编译工具链。
1.1 简介
1.1.1 Petalinux的交叉编译工具链交叉编译是编译技术发展过程中的一个重要分支。通俗的说,交叉编译就是在一个平台上生成另一个平台上的可执行代码。这里提到的平台有两方面的含义:处理器的体系结构和所运行的操作系统。 通常,程序是在一台计算机上编译,然后再分布到将要使用的其它计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。嵌入式系统应用的日益广泛和需求推动了交叉编译技术的发展。嵌入式系统开发,一般都是基于X86的PC平台进行,如果开发非X86的嵌入式系统,由于嵌入式系统资源的匮乏,交叉编译几乎是唯一手段。嵌入式系统中的应用程序都是通过交叉编译得到的。 我们使用Petalinux工具编译,显示Petalinux工具是带有交叉编译工具链的。设置Petalinux的工作环境后,输入“aa”,然后按TAB键,会显示当前环境中,以“aa”开头的工具和命令,包括交叉编译的工具和命令,如下图所示: 其中以aarch64开头的是aarch64的交叉编译工具链,显示的aarch64交叉编译工具链只有none,也就是裸机下的交叉编译工具链,不能编译linux,那么用于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上运行。
1.1.2 Qt简介Qt是一个跨平台的C++图形用户界面应用程序开发框架。它既可以开发GUI图形用户界面程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器 (MetaObject Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。 Qt是一个完整的开发框架,其目的旨在简化桌面、嵌入式和移动平台的应用程序和用户界面的创建。Qt除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等。 大部分应用程序都可以使用Qt实现,除了与计算机底层结合特别紧密的,例如驱动开发,它直接使用硬件提供的编程接口,而不能使用操作系统自带的函数库。 由于Qt良好的跨平台特性,基本上不做修改就可以在Linux上实现同样的界面。Linux操作系统是嵌入式的主力军,广泛应用于消费类电子、工业控制、军工电子、电信‍/‍网络‍/‍通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。 开发Qt需要搭建Qt开发环境。Qt有自己的集成开发环境——Qt Creator。Qt Creator是一个跨平台的、完整的Qt集成开发环境(IDE),其中包括了高级C++代码编辑器、项目和生成管理工具、集成的上下文相关的帮助系统、图形化调试器、代码管理和浏览工具等。与常见的IDE不同的是,QtCreator本身是一个空壳,不包含编译器和Qt库,所以后面还需要配置QtCreator。 由于使用Qt的人很多,市面上关于Qt的教程也很多,入门的、深入的都有,所以本章就不浪费时间讲解如何安装Qt了,读者可自行上网搜索Qt的安装,也可阅读本章扩展阅读部分的“安装Qt”。
1.1.3 OpenCV简介OpenCV全称 Open Source Computer VisionLibrary,是一个开源的计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法,我们可以调用它提供的各种 API 接口对图像进行算法处理,例如图像模糊处理、边缘检测、滤波以及人脸识别等相关应用场景,笔者对此并不是很了解,大家有兴趣的话可以在网上百度 get 这些知识。 OpenCV基于 BSD 协议,因此它可免费用于学术和商业用途,其提供 C++、C、Python 和 Java 接口,支持 Windows、Linux、Mac OS、iOS 和 Android 等多种操作系统。 OpenCV提供了丰富的API可简化我们对图像处理相关的编程工作,同样这些API也是封装成链接库的形式,可以是动态链接库(Dynamic linklibrary)或者静态链接库(Staticlink library);对于嵌入式Linux系统来说,我们需要通过交叉编译将OpenCV源码编译成可适用于ARM平台的链接库文件,那么如何获取适用于ARM平台的链接库文件呢? 答案是可以使用Petalinux构建,通过定制根文件系统的方式将OpenCV库添加到根文件系统中,这样就获取到了用于我们开发板的链接库文件。
1.2 定制根文件系统rootfs前面介绍了SDK与Petalinux构建的根文件系统息息相关,这是因为SDK中包含了根文件系统,而根文件系统中又包含了我们添加的各种各样的软件库,特别是链接库,我们在电脑主机中开发编译Qt或OpenCV时就需要这些链接库。下面我们定制本章的根文件系统。 进入到第六章Petalinux设计流程实战中创建的petalinux工程目录下,然后按照6.3.2小节设置Petalinux环境变量。输入如下命令配置根文件系统: - petalinux-config -c rootfs
复制代码执行结果如下图所示: 下面定制本章需要的根文件系统。(在第九章的基础上定制) 1.2.1 添加Qt添加Qt需要对如下配置项进行配置: - PetalinuxPackage Groups --->
- packagegroup-petalinux-qt --->
- packagegroup-petalinux-qt(Y)
- populate_sdk_qt5(Y)
复制代码结果如下图所示: “packagegroup-petalinux-qt”中包含了linux系统使用Qt需要的基本包。移动到“packagegroup-petalinux-qt”,然后用界面下方的“< Help >”查看其含义,也可以按下键盘上的H键,结果如下图所示: 可以看到“packagegroup-petalinux-qt”中包含了Qt的基本包有哪些。“populate_sdk_qt5”表示包含Qt5主机工具链,同样可以用< Help >查看其含义。 其中的dev和dbg应该对应着开发和调试,由于没有具体说明,此处就不配置了。 对于Qt,还有一个Qt扩展“qt-extended”的包组,名为packagegroup-petalinux-qt-extended,此处笔者没有添加该包组,有需要的读者可自行添加。 1.2.2 添加OpenCV添加OpenCV需要对如下配置项进行配置: - PetalinuxPackage Groups --->
- packagegroup-petalinux-opencv --->
- packagegroup-petalinux-opencv(Y)
复制代码结果如下图所示: packagegroup-petalinux-opencv包含着linux系统使用opencv需要用到的基本库,可以用< Help >查看,结果如下图所示: 图 10.2.5 packagegroup-petalinux-opencv中的包 1.2.3 添加Python当今社会,随着深度学习及AI的兴起,使用Python的人越来越多,在根文件系统中必然不可缺少对Python的支持,添加Python需要对如下配置项进行配置: - PetalinuxPackage Groups --->
- packagegroup-petalinux-python-modules --->
- packagegroup-petalinux-python-modules(Y)
复制代码结果如下图所示: 用< Help >可以看到packagegroup-petalinux-python-modules包含如下Python工具包: 1.2.4 添加视频工具库v4lutils(可选)如果想使用开发板对视频进行采集开发等,可以添加视频工具库v4lutils。添加视频工具库v4lutils需要进行如下配置: - PetalinuxPackage Groups --->
- packagegroup-petalinux-v4lutils --->
- packagegroup-petalinux-v4lutils(Y)
复制代码结果如下图所示: 用< Help >可以看到packagegroup-petalinux-multimedia包含如下包: 笔者未使用过,就不介绍了。 1.2.5 添加音频库audio(可选)要想添加对音频的操作,可以添加音频库audio。添加音频库需要进行如下配置: - PetalinuxPackage Groups --->
- packagegroup-petalinux-audio --->
- packagegroup-petalinux-audio(Y)
复制代码结果如下图所示: 用< Help >可以看到packagegroup-petalinux-audio包含如下包: 由于添加音频库会使根文件系统变大、且不是每个人都需要的,所以是可选,此处介绍是让读者知道有这么个东西。 1.2.6 添加gcc编译工具链(可选)要想在开发板上直接编译C/C++源码,可以添加gcc编译工具链,也就是packagegroup-petalinux-self-hosted,self-hosted直译就是自主机的,也就是把开发板当作主机来开发使用。添加packagegroup-petalinux-self-hosted需要进行如下配置: - PetalinuxPackage Groups --->
- packagegroup-petalinux-self-hosted --->
- packagegroup-petalinux-self-hosted(Y)
复制代码结果如下图所示: 用< Help >可以看到packagegroup-petalinux-self-hosted包含如下包: packagegroup-self-hosted中包含着gcc编译工具链;对于whetstone,笔者查到的信息好像是一种性能测试工具;vim,相信不需要笔者进行介绍了,linux中一种流行的文本编辑器。 注意该包是可选的,添加会增大根文件系统的大小,需要的话可以添加。 1.2.7 添加utils工具(可选)要想丰富根文件系统的一些常用工具,如查看cpu频率等,可以添加utils工具包,需要进行的配置如下: - PetalinuxPackage Groups --->
- packagegroup-petalinux-utils --->
- packagegroup-petalinux-utils(Y)
复制代码结果如下图所示: 用< Help >可以看到packagegroup-petalinux-utils包含如下包: 1.2.8 添加网络工具(可选)要想丰富根文件系统的网络相关方面的功能,如访问mdio寄存器等,可以添加网络栈包networking-stack,需要进行的配置如下: - PetalinuxPackage Groups --->
- packagegroup-petalinux-networking-stack --->
- packagegroup-petalinux-networking-stack(Y)
复制代码结果如下图所示: 用< Help >可以看到packagegroup-petalinux-networking-stack包含如下包: 1.2.9 添加GPU库(可选)配置rootfs来构建用于在GPU上运行图形应用程序的mali.ko。 - FilesystemPackages --->
- libs --->
- libmali-xlnx --->
- libmali-xlnx
复制代码结果如下图所示: “mali-backend-defaults (x11)”表示mali的后端是x11,也可以选择其他的后端,可选的后端如下: 配置完成后,保存配置并退出。 1.3 编译根文件系统并构建SDK使用如下命令编译刚才定制的根文件系统: - petalinux-build -c rootfs
复制代码结果如下图所示: Petalinux工程编译生成的根文件系统在images/linux/目录下。 构建SDK的命令如下: 该命令可构建SDK并将其部署在当前Petalinux工程的images/linux/sdk.sh中。 注:笔者不推荐读者自己构建SDK,一是因为由于Petalinux本身bug的原因会出现一些ERROR,有些ERROR不好解决,二是构建SDK太耗硬盘空间。推荐使用我们提供的已经构建好的SDK文件,路径为资料盘A盘:4_SourceCode\3_Embedded_Linux\资源文件\sdk.sh。 构建时可能会出现如下图所示的错误: 解决的方法也很简单,配置Petalinux工程,让其可以联网下载,命令如下: 进入到Yocto Settings界面,取消使能BB_NO_NETWORK,如下图所示: 保存配置并退出。 现在继续构建SDK,结果如下图所示: 可以看到是将之前的ERROR变成了WARNING,并未从根本上解决问题。从编译根文件系统没问题而构建SDK有问题来看,可能是Petalinux的一个bug。定制根文件系统时添加的包越多,就越会出现一些奇怪的错误,因而推荐读者在构建SDK之前尽可能少的添加包到根文件系统中,以避免产生无法解决或很难解决的错误,在构建SDK完成后,再定制根文件系统将之前未添加的包或工具添加到根文件系统中。 成功构建的SDK文件在工程的images/linux目录下,名为sdk.sh,如下图所示: 可以看到构建的SDK文件是一个脚本文件,需要执行才能使用,也就是安装sdk。命令如下: - cd images/linux/
- ./sdk.sh
复制代码首先进入到当前Petalinux工程的images/linux目录下,然后执行sdk.sh进行安装,结果如下图所示: 如果使用的是网盘提供的sdk.sh文件,需要先将其拷贝到Ubuntu系统中,然后执行sdk.sh进行安装。 默认是安装在/opt/petalinux/2019.2目录下,如果想安装在其他目录下,可以输入相应的路径,此处笔者保持默认,按回车键继续,结果如下图所示: 再次确认是否将SDK安装在/opt/petalinux/2019.2目录下,默认为“Y”,也就是“是”,按回车键继续往下执行安装。等待安装完成,安装完成后提示在一个新终端中使用SDK前需要先执行“./opt/petalinux/2019.2/environment-setup-aarch64-xilinx-linux”以设置相应的环境变量,其中的“.”和source具有相同含义。 |