【QT基础示例1】gcc9.3.0下地平线QT5.12.12交叉编译及部署

一、前言

目前旭日x3工具链已经更新到gcc9.3.0,官方使用的底层sdk也是通过gcc9.3.0编译,之前gcc6.5.0工具链编译的QT5.12.12已经不适用于当前生态,故本文采用最新工具链gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu重新编译QT5.12.12,并从编译到部署第一个最简单demo,同时本文也将编译好的QT5.12.12库上传,用于大家使用。

已编译好的qt库链接:-
链接:https://pan.baidu.com/s/1mgL2d-9stDBCqVwBAaKaQA?pwd=0oun-
提取码:0oun

注意:本示例使用的系统为桌面端x3pi_ubuntu_desktop_disk_20230225032350,这是由于桌面端系统在板端直接有qt5相关的库及插件。如果使用X3 sdb linux系统需要将交叉编译的库部署到板端,具体参考:https://developer.horizon.ai/forumDetail/143771914962373980且X3 sdb linux系统只能输出到hdmi

x3server系统可通过以下命令安装qt相关库到板端:

sudo apt-get qt5-default
sudo apt-get install python3-opencv

其中python3-opencv是为了安装缺少的Qt平台插件“xcb”以便于Qt实现x11传输显示。

二、完成C/C++交叉编译器的配置

参考地平线官方旭日X3 SDB资料→X3SDB Yocto系统镜像→X3M_SDK_BR22_20230128-1201→documentation→用户手册→documents→BSP开发指南→环境搭建及编译说明,部署工具链-
本文采用的ubuntu20.04进行工具链部署与编译

2.1 解压交叉编译工具链

工具链位于X3M_SDK→board_support_package→platform_source_code→toolchain中

sudo tar -xvf gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu.tar.xz -C /opt

解压完成后,打开环境变量~/.bashrc

sudo geidt ~/.bashrc

在最末尾添加:

export CROSS_COMPILE=/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-
export LD_LIBRARY_PATH=/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export PATH=$PATH:/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/
export ARCH=arm64

保存后重启控制台即使能交叉编译工具链

三、下载并编译qt源码

https://mirrors.aliyun.com/qt/archive/qt/5.12/5.12.12/single/?spm=a2c6h.25603864.0.0.5fc037d0XfTyvM下载qt-everywhere-opensource-src-5.12.12.tar.xz压缩包并解压

tar -xvf qt-everywhere-opensource-src-5.12.12.tar.xz

进入上述解压的qt-everywhere-opensource-src-5.12.12的文件夹,配置 ./configure 文件,并编译

./configure -release -xplatform linux-aarch64-gnu-g++ -prefix ~/qt5.12.12 -no-sse2 -no-sse3 -no-sse4.1 -no-sse4.2 -no-avx -no-avx2 -no-mips_dsp -no-mips_dspr2 -no-pkg-config -no-glib -nomake examples -nomake tools -nomake tests -no-cups -no-iconv -no-dbus -no-opengl

make -j8
make install

注意:上述过程中不要使用sudo,否则会出现工具链找不到的情况

其中:

-xplatform后面接的是编译器类型linux-aarch64-gnu-g++,可用的类型以及配置文件在qt-everywhere-opensource-src-5.12.12/qtbase/mkspecs/

-prefix 后面接的是 安装文件夹 我放的是在~/qt5.12.12 其余的配置命令是选择不安装的包

注:

  1. 如果重新配置的话,需要执行./configure -redo
  2. 如果只编译基本的Qt 模块,可以进入qt-everywhere-opensource-src-5.12.12/qtbase 文件夹下配置并编译

四、交叉编译器Qt Creator设置

具体可参考:https://developer.horizon.ai/forumDetail/143771914962373980

本章只对不同的地方做简述:

gcc编译器选择:/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

g++编译器选择:/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

Qt Versions按最终安装库位置的qmake选择

4.1 添加设备设置

qt在交叉编译时,提供直接编译和部署选项,qt能够自动将编译好的程序发送到板端,具体进行以下设置:

点击选项中的设备,点击添加,参考以下内容添加一个新设备x3

其中需要修改的选项为:

4.2 kit设置

完成设备设置后,新建kit,将设备和编译器完成选择

image.png

五、编译第一个Qt程序并在宿主机显示

5.1 新建项目

新建一个Qt Widget Application

image.png

一路默认后选择设置好的交叉编译kit:

image.png

即可生成第一个项目,但此时如果直接点击小锤子进行编译,会报告工具链有一些库找不到:

image.png

因此需要对qt设置进行修改

5.2 项目配置

gcc9.3.0在编译qt项目时主要会出现两个错误:

  • 找不到/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu下面的库
  • 找不到libdl.so库

因此需要对上述两个问题进行修正

1.修正找不到x86_64-linux-gnu路径下的库

首先安装下图所示步骤,在Build Environment中添加:

LD_LIBRARY_PATH /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

image.png

2.修正找不到libdl.so库

在.pro文件中添加下述语句:

LIBS += -L/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/aarch64-linux-gnu/lib -ldl

image.png

5.4项目编译及运行

5.4.1 修改x11配置

完成上述配置后,即可进行交叉编译程序,为了更方便的看到运行结果,我们使用x11-forwarding将窗口直接映射到宿主机端进行查看,x11-forwarding在x3pi上的解析和基础使用效果可见:https://developer.horizon.ai/forumDetail/98129540173361504

为了实现x11-forwarding在宿主机端的映射,需要进行以下操作安装ssh服务器和ssh客户端:

sudo apt install openssh-server
sudo apt install openssh-client

安装好ssh服务器和ssh客户端后,修改ssh设置:

sudo gedit /etc/ssh/ssh_config

将其中的内容修改为:

ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes

重启服务:

sudo systemctl restart ssh.service

5.4.2 运行第一个qt程序并在宿主机显示

点击运行直接完成编译和运行-

image.png-
要求输入板端密码,完成输入-
image.png-
大功告成,窗口将直接显示在宿主机端~-
image.png

5.15.2版本可以参考这里进行配置,感谢 一诚的适配

qtcreator的链接失效了怎么搞

我想问一下,跟着您的教程都搞定了,但是有个问题,我开启X11后,现在界面是映射了,运行可以弹出窗口,但是我用VNC去监控板子窗口,板子界面并没有弹出helloworld的窗口。-

还有我想问一下,我想最好也能调试。但是当我在debuggers中添加/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb时,系统提示could not determine debugger type。

1. x11是用于映射到宿主机端,vnc属于远程,映射的终端应该是不一样的,可以尝试在qt设置中取消x11映射(我记得是有这个选项的),如果不行,就只能在vnc中直接运行qt程序的执行文件,这样呼出qt界面

2. gdb我也试了,也是不行,有可能是qt creator版本比较低,之前试过gcc6.5的老版本编译器,那个gdb是可以识别出来的

Index of /archive/qt/5.12/5.12.12

Forward to local display试试