一、前言
这段时间事情太多,去整了个关于DSP的项目(以后有机会在CSDN讲讲),同时由于要开题,QT的编译说明拖了几个月,今天看到社区上有人在问,赶紧再次撰写旭日x3派试用体验,本文主要讲述交叉编译QT环境。此环境不仅适用于旭日x3pi的ubuntu系统,也适用于X3SDB的嵌入式linux系统。-
注意:现在X3pi上ubuntu系统可以直接通过apt install qt(具体命令不记得了)安装ARM64版QT套件,即可以直接在x3pi上进行编译开发,可能通过ssh远程x3pi并在x3pi编译会更方便?
二、完成C/C++交叉编译器的配置
根据【 地平线旭日X3派试用体验】地平线交叉编译环境部署完成交叉编译器部署:gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu
注:我也采用gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu
编译器尝试过编译,但出现问题,因为gcc6.5.0也能在x3pi上使用就懒得去查问题了,希望有大神能够解决
三、下载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
压缩包 并解压
四、qmake编译
进入上述解压的qt-everywhere-opensource-src-5.12.12
-
的文件夹,配置 ./configure 文件,并编译,这个configure真是反复测试之后得到的,前面的交叉编译环境配好了基本不会有问题= =,我自己给实验室的师弟们配了3个
./configure -release -xplatform linux-aarch64-gnu-g++ -prefix /home/lza/Downloads/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 -no-xcb
make -j4
make install
其中:-xplatform后面接的是编译器类型linux-aarch64-gnu-g++,可用的类型以及配置文件在qt-everywhere-opensource-src-5.12.12/qtbase/mkspecs/
-prefix 后面接的是 安装文件夹 我放的是在/home/lza/Downloads/Qt5.12.12
其余的配置命令是选择不安装的包
注:
- 如果重新配置的话,需要执行
./configure -redo
- 如果只编译基本的Qt 模块,可以进入
qt-everywhere-opensource-src-5.12.12/qtbase
文件夹下配置并编译
五、交叉编译器Qt Creator设置
首先下载Qt Creator:https://mirrors.aliyun.com/qt/archive/qt/5.12/5.12.12/?spm=a2c6h.25603864.0.0.7bc26dd0EMaeFp
可以在上述路径中选择linux版本进行安装,完成安装后进入Qt Creator
进入Qt Creator 后 在菜单栏下 进入 Tools->Options 选择kits 进行配置,这里可以注意看Kits中的选项,即是我们要编译的编译包,其中Desktop Qt是安装好Qt后自带的桌面开发编译包,aarch64是我之前添加好的地平线编译包,大家可以根据后面的步骤完成配置,配置好后即可使用qt交叉编译-
配置Qt Versions:
点击Qt Version下的manage进行Qt Version的选择
QtVersion.png点击 Add ,选择上述编译安装文件夹下的bin/qmake
文件,之后点击Apply
配置Compilers
-
C交叉编译器:点击Add,并选择 GCC->C ,在弹出窗口中,命名后,选择
c交叉编译器aarch64-linux-gnu-gcc
文件,我的交叉编译器路径为:-
/opt/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
-
-
C++ 交叉编译器:点击Add,并选择 GCC->C++ ,在弹出窗口中,命名后,选择aarch64-linux-gnu-g++文件,我的交叉编译器路径为:-
g++编译器设置
/opt/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
-
配置Kits:
点击Add后,修改Name 选项,并将Compiler选项中的C: 和C++: 编译器设置为上述添加的aarch64版的,再将Qt Version: 修改为上述添加的Qt Version, 即可完成配置。-
六、编译第一个交叉编译程序
通过上述方法,qt交叉编译即配置完成,可以新建一个最简单的qt widget程序-
注意,这里选择我们之前配置好的交叉编译kit-
kit选择-
点击左下角的小锤子即可完成编译,但注意在主机上只能完成编译,编译生成的程序还需要拷贝到板端进行运行-
交叉编译Qt程序
七、板端运行qt程序
1.首先将步骤四中编译得到的文件拷进开发板中,我编译得到的文件夹是/home/lza/Downloads/Qt5.12.12
这一步是为了防止板端没有qt对应的库,因此必须拷贝
注:上面这一步是X3SDB的必须步骤,但是x3pi有了ubuntu系统之后可以直接apt install qt(具体命令记不清了,总之就是可以直接装个qt),安装好之后,板端直接就有qt的arm64库
2.修改开发板环境
export QT_ROOT=/userdata/lza/Qt5.12.12/Qt5.12.12 # 设置Qt 根目录 QT_ROOT变量名 需要根据实际情况修改!!!
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts # 设置Qt 字体路径
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins/platforms # 设置运行平台 本质上是 下面linuxfb所在的目录,因此该文件夹下必须有liblinuxfb
# 如果在X3SDB嵌入式linux系统上运行取消下面这句话
# export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
# 设置显示模式
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QT_ROOT/lib # 将 Qt链接库 添加 进系统链接库
可以通过export命令查看是否导入成功。
注:交叉编译生成的 Qt文件夹路径 并不完全相同,报错的话,需要根据实际情况修改路
注意:其中有一句export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0,这句话是给X3SDB嵌入式linux系统指定显示设备的,有了这句话QT 的窗口会直接以最大化显示在hdmi
3.拷贝QT Widget并运行
如果未指定生成路径,build后的结果在build-<项目名>….aarch64-Debug中,把这个文件夹拷贝到板端,通过X3pi的ubuntu桌面运行其中的可执行文件,编好的QT窗口程序即可显示,如果是X3SDB会直接全屏输出在HDMI接的屏幕上
七、感言
今天上论坛偶然发现有人询问QT相关的问题,想到自己当初也是踩了太多太多的坑才实现,不禁有些感慨,于是赶紧写了这篇文章,希望能帮助其他开发者少走些弯路,嵌入式ARM属实是一个有趣的领域,我也只是刚入门的小白,文章中有问题的可以请各位大神指出。
最后感谢地平线的认可,之前收到了地平线的年度开发者奖杯,但惭愧并未给社区做出很多贡献,这段时间闲下来会给社区带来更多产出。
TO BE CONTINUED
之后还会分享一个qt的usb相机小demo