一、前言
目前旭日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
其余的配置命令是选择不安装的包
注:
- 如果重新配置的话,需要执行
./configure -redo
- 如果只编译基本的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
其中需要修改的选项为:
- 主机名称,填写自己的板端ip地址
- 用户名,填写root-
!image.png-
填写好后,点击Test可以测试连通性,如下图显示Device test finished successfully即连接成功。-
image.png
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.png2.修正找不到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