本帖最后由 正点原子运营 于 2024-2-2 17:32 编辑
第十章 Petalinux构建Qt和OpenCV交叉编译开发环境
1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板
2) 章节摘自【正点原子】DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南 V1.0
3)购买链接:https://detail.tmall.com/item.htm?id=692450874670
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz-MPSOC.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)Linux技术交流QQ群:887820935
1.4 SDK中的Qt和OpenCV库安装完成之后,我们进入到安装目录/opt/petalinux/2019.2下,该目录下有一些文件和文件夹,如下所示: 该目录下有一个环境变量配置文件environment-setup-aarch64-xilinx-linux,每次使用之前都需要使用source来运行这个配置文件,例如: - source environment-setup-aarch64-xilinx-linux
复制代码当SDK环境变量配置完成之后,我们可以在终端输入aarch,然后连按三次TAB键查看交叉编译相关的命令,如果配置成功则会显示如下信息,表示环境变量已经配置成功了: 此时,我们就得到了linux交叉编译工具链,可以摆脱Petalinux,直接使用linux交叉编译工具链编译uboot、linux内核和linux应用。 文件夹sysroots/aarch64-xilinx-linux下存放的是我们本章构建的根文件系统,如下图所示: 该根文件系统可直接用于我们的开发板。 在sysroots/aarch64-xilinx-linux/usr/lib目录下有很多的库文件,其中就包含了Qt相关的链接库以及OpenCV相关的链接库文件,如下所示:
1.5 设置SDK的工作环境在正式使用SDK之前,需要先设置SDK的工作环境,在终端输入如下命令即可: - . /opt/petalinux/2019.2/environment-setup-aarch64-xilinx-linux
复制代码执行结果如下图所示: 设置完SDK的工作环境后,就可以获得linux交叉编译工具链,如图 10.4.2所示。不过使用的时候并不是直接使用交叉编译工具链,而是使用${CC}和${LD}两个环境变量(可以简写成$CC和$LD),如下图所示: 可以看到$CC环境变量是带参数的aarch64-xilinx-linux-gcc交叉编译工具链的定义,特别是其中的sysroot参数,没有该参数,直接使用aarch64-xilinx-linux-gcc编译C源文件会报错。这就是为何不能直接使用aarch64-xilinx-linux-gcc,而是需要使用$CC的原因,所以后面需要编译用于开发板上的C程序源码文件时,应使用如下方式编译: - $CC c源码文件
- #或者
- $CXX c++源码文件
复制代码$CXX环境变量是带参数的aarch64-xilinx-linux-g++交叉编译工具链的定义,可直接用于编译C++程序源码文件。 调试工具为aarch64-xilinx-linux-gdb,对应的环境变量为$GDB,这些交叉编译工具的路径可以通过whereis命令查看,如输入“whereis aarch64-xilinx-linux-gdb”,可查看aarch64-xilinx-linux-gdb的路径,如下图所示: 注:每打开一个新的终端,需要重新设置SDK工作环境。当前终端中的设置只在当前终端有效。
1.6 配置Qt Creator要想用QT Creator开发用于开发板的Qt demo需要配置QT Creator。在Ubuntu系统中打开QTCreator(如果没有安装QTCreator,请阅读本章扩展阅读部分的“安装Qt”) 打开QT Creator后,QT Creator界面如下图所示: 现在开始配置QT Creator。如图 10.6.3所示,点击QT Creator菜单栏的“工具(Tools)”菜单,在弹出的菜单中点击“选项(Options)…”以打开配置选项界面。 打开的配置选项界面如下图所示: 1、 配置编译器(Compilers) 配置编译器也就是配置linux交叉编译工具aarch64-xilinx-linux-gcc和aarch64-xilinx-linux-g++。 点击左侧栏中的“Kits”,然后点击右侧的“编译器”配置项,可以看到Qt Creator自动检测到系统中的C和C++编译器(Auto-detected选项下),如下图所示: 这个页面用于配置Qt Creator编译代码时所使用的编译工具。 从“Auto-detected”列举出来的编译工具信息可以知道GCC的路径都是在Ubuntu系统的/usr/bin目录中,且都是用于64位的x86架构的CPU,用这些编译工具编译出来的代码只能在Ubuntu虚拟机上运行。 上图中“Manual”选项下的编译工具需要手动添加,点击右边的添加,在下拉的菜单栏中依次选择GCC->C,如下图所示: 点击之后,在出现的属性栏中,修改编译器名称为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++”。 从“Manual”选项下添加的编译工具信息可以知道“Manual”栏下的GCC都是用于64位的arm。我们展开“Manual”,可以看到更完整的信息,如下图所示: 从GCC的路径信息可以知道,安装路径来自/opt/petalinux/2019.2/,也就是SDK安装路径是我们本章构建的linux交叉编译工具aarch64-xilinx-linux-gcc和aarch64-xilinx-linux-g++。 2、 配置 Debuggers 配置Debuggers,也就是配置调试工具aarch64-xilinx-linux-gdb。 点击右边的Debuggers选项卡切换到该页面,如下所示: 该配置项用于配置Qt程序的调试工具,具体的调试方法笔者也未曾使用过,所以调试方法这里就不给大家介绍了。点击右边菜单Add添加新的debugger,如下所示: 在“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,如下所示: “Name”栏的“Qt%{Qt:Version}(System)”可以改为其他名字,也可以不改,此处笔者改为“Qt %{Qt:Version}(zynqMP)”,方便辨认。 从上图可以看到,Petalinux使用的Qt版本为5.11.3。 配置完成点击“Apply”应用按钮。 4、配置Kits 点击上边的 Kits 选项卡切换到该页面,如下所示: 点击右边“添加(Add)”按钮添加一个Kit。Kit其实就是对前面的各个配置项进行打包,变成一个Kit套件,而当我们使用QtCreator创建Qt工程的时候会选择一个Kit套件,并基于它创建我们的工程。上图中的“Auto-detected”列表下已经存在一个配置好的Kit套件Desktop Qt 5.14.2 GCC 64bit,从名字可以知道,该Kit适用于创建在Ubuntu桌面系统上运行的Qt程序,所以不能用于创建一个能够在ZYNQ MPSoC开发板上运行的Qt程序,所以这里需要添加一个新的Kit。 点击右边“添加(Add)”按钮添加新的Kit,如下图所示: 在第一栏的Name栏为Kit套件命名,例如zynqMP。 Device type:选择设备的类型,这里有四个选择项,分别为Desktop(PC机)、Android Device(安卓设备)、Generic Linux Device(通用Linux设备)和 QNXDevice(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名字前面有一个黄色感叹号,这是一个警告信息,原因在于我们配置了Devicetype,而没有配置 Device,这个后面有用到的时候再跟大家讲。 点击“OK”按钮配置完成退出界面,至此我们的Qt Creator就配置完成了。下一节我们将对前面所做的配置工作进行测试。 1.7 搭建Qt测试工程点击Qt Creator的菜单栏File -> New File or Project(或者直接使用快捷键 Ctrl + N)打开工程创建面板,如下所示: 左边选择工程类型,这里我们选择的是一个Application(Qt)应用程序,右边选择工程模板,这里我们选择Qt Widgets Application,点击“Choose...”按钮进入下一步。 设置qt工程名和路径,如下图所示: 在Name栏中设置qt工程名为“qt_test”,工程路径任意,此处选择/home/shang/workspace/qt,路径必须要存在,不然会报错。 设置完成之后点击“下一步(Next)”按钮进入下一步,如下图所示: “Build system”默认为qmake,此处保持默认即可。点击“Next”按钮进入下一步,如下图所示: 保持默认配置,直接点击“Next”按钮进入下一步,如下图所示: 同样保持默认配置,直接点击“Next”按钮进入下一步,如下图所示: 前面介绍过,在创建Qt应用程序的时候需要选择Kit,并基于该Kit创建我们的工程。由于本小节是测试之前配置的QT Creator能否正常工作,所以这里选择“zynqMP”。点击“下一步(Next)”按钮进入下一步,如下图所示: 直接点击“完成”按钮完成工程创建。工程创建完成之后,如下所示: 此时双击左边文件列表Forms中的mainwindow.ui文件,打开 QtCreator 的图形化编程界面,如下所示: 图 10.7.9 Qt Design 图形化编程界面 这是Qt Creator中集成的Qt Design图形化编程工具,左边栏显示了Qt所支持的控件,中间显示GUI控件编程、布局界面,而右边界面显示了Qt控件所支持的各种属性,可以对其进行修改。 图10.7.10中笔者随便拖入几个控件,包括一个日历控件Calendar Widget、一个按钮控件Push Button 以及一个Label控件,并对它们进行了简单地布局、调整、修改了Label控件的显示的文字内容和大小(选中Label控件,可以在右下角列出的属性表中找到对应的设置项),如下图所示: Qt工程编程完成后使用Ctrl+S快捷键进行保存,然后点击左下角的小锤子按钮编译工程,如下所示: 编译过程中可以点击下方的“编译输出(Compile Output)”按钮查看编译输出信息,如下所示: 从打印信息可以知道,当编译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.10 的qt界面,然后重新编译。 编译成功之后不能直接点击Qt Creator右下角的绿色小三角按钮运行 Qt 程序,因为这个程序不能在Ubuntu系统下运行,我们需要将编译生成的可执行文件拷贝到开发板根文件系统目录中,然后在ZYNQ MPSoC开发板系统下运行。 打开Ubuntu终端,进入到Qt工程所在目录,如下: qt_test就是笔者创建的工程,build-qt_test-zynqMP-Debug目录下存放的就是工程编译过程中所生成的文件,包括最终的可执行文件都在这个目录下,进入到该目录,如下图所示: 其中qt_test是最终的可执行文件,可以使用file命令查看该文件的属性,如下图所示: 由此可以知道该文件是一个ELF格式的可执行文件,可以运行在64位ARM架构的Linux 系统下,所以我们需要把该文件放置到开发板上运行。
1.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) 运行qt_test程序,如下图所示: 与开发板miniDP接口连接的显示器显示的内容如下图所示: Qt界面是在上一章搭建的Matchbox桌面上显示的。在串口终端按Ctrl + C快捷键可结束程序运行。
1.9 扩展阅读:
1.9.1 安装Qt为了防止有些读者没有找到好的Qt安装教程,此处推荐B站用户“他是个小白”的一个qt安装的视频: 注:不要安装Qt6版本,因为Qt6不支持Ubuntu18版本。 |