目录

一、在Ubuntu20.04配置aarch64交叉编译环境

二、在Ubuntu20.04下载并编译aarch64系统架构的Qt6源码

三、在arm64芯片板上配置Qt6环境

四、配置后出现的问题及解决办法


网上大多数文章都是针对Qt5版本的配置(不编译源码的话,搭建Qt5环境只需要半天(ˉ▽ˉ;)...),按照这些步骤进行Qt6的配置踩了很多坑,现在把我配置Qt6的整个过程记录下来,有这方面的需求可以参考一下,耗时一周多,属实不易/(ㄒoㄒ)/~~

一、在Ubuntu20.04配置aarch64交叉编译环境

1.第一步很重要!首先要看一下你的ubuntu系统是不是arm64位的,如果只是在windows上下个虚拟机来装的ubuntu系统,那么该系统架构是X86-64,而我需要的系统架构是aarch64的,这样弄出来的qt库跟交叉编译工具是不匹配的,也可以理解为要在ubuntu系统上搭建一个aarch64环境。当然,如果芯片板子上的内存足够,可以直接编译Qt源码,则可跳过这一步( ‵▽′)ψ。

说到内存,建议分配给虚拟机50~100G左右的内存(编译到一大半提示内存不够(╯‵□′)╯︵┻━┻)

具体步骤参考这篇文章:https://blog.csdn.net/u012841922/article/details/121048387

查看系统架构

sudo uname -a

2.更新软件源和升级更新软件(以下在aarch64系统架构里进行) 

apt-get update
apt-get upgrade

3.下载交叉编译工具

apt-get install gcc-aarch64-linux-gnu
apt-get install g++-aarch64-linux-gnu

4.添加到环境变量中(这里vi可能会报错,因为这相当于一个新系统,很多东西都没有,自行下载即可)

vi /etc/profile

在文件末尾添加

export PATH="/usr/bin:$PATH"

输入以下指令或reboot重启使环境立即生效

source /etc/profile

5.查看版本(gcc/g++),有版本显示即可

aarch64-linux-gnu-gcc -v

二、在Ubuntu20.04下载并编译aarch64系统架构的Qt6源码

1.首先下载Qt6.4.0的源码压缩包(最近发现没有qt6.4资源了,以下链接是qt6.5的,后面的步骤相同)

下载地址:https://download.qt.io/official_releases/qt/6.5/6.5.0/single/

 

2.把下载的源码压缩包移动到aarch64环境目录中

sudo mv 下载源码的目录/qt-everywhere-src-6.4.0.tar.xz /rootfs/usr/bin/

3.chroot到aarch64系统中,进到/usr/bin/目录解压源码

tar -xvf qt-everywhere-src-6.4.0.tar.xz

4.解压完毕,进入到源码目录,修改文件 

vi qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf

5.增加以下内容,并在每个编译器前面添加路径(板子芯片是armv8架构)

QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts

具体如下:

注:/usr/bin/这个路径我是根据查看版本时改的,默认是没有的。

6.查看Qt6源码文档(这一步容易被忽略)

cat README.md

主要看以下部分

这是编译qt6源码所需要的,我只有perl和python3,部分解决方法参考下面文章:

安装cmake:https://blog.csdn.net/qq_27350133/article/details/121994229

安装python:https://blog.csdn.net/GerZhouGengCheng/article/details/118468389

解决在编译过程中perl出现警告:https://blog.csdn.net/gusijin/article/details/105512007

安装ninja,直接终端执行以下指令即可

apt-get install ninja-build

安装xcb(图形界面):https://blog.csdn.net/luoyayun361/article/details/118493387

补充:至此,理论上来说编译qt6源码所需环境已经配置好,编译过程也没问题,但是程序运行时会有如下报错:qt.qpa.plugin: could not find the ot platform plugin "xcb" in ""。问题就在于/usr/bin/arm64qt6.4.0/plugins/platforms/这个路径下缺少一个libqxcb.so,这个库文件是支持界面显示的,如果你的程序没有界面就不影响运行结果,解决办法如下:

首先检查安装以下文件(文件较多,因为我不确定缺少哪个导致没有编译出libqxcb.so),其中如果有系统提示找不到的,或者报错的,注释掉即可,重复的会有,因为前面安装过xcb了。

apt-get install ibcrypto++8 libcrypto++-dev libinput-dev libssl-dev libx11-doc libx11-freedesktop-desktopentry-perl libx11-guitest-perl libx11-keyboard-perl libx11-protocol-other-perl libx11-windowhierarchy-perl libx11-xcb-dev libx11-xcb-perl libxcb-composite0 libxcb-composite0-dev libxcb-cursor0 libxcb-cursor-dev libxcb-damage0 libxcb-damage0-dev libxcb-doc libxcb-dpms0 libxcb-dpms0-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-ewmh2 libxcb-ewmh-dev libxcb-glx0-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-imdkit1 libxcb-imdkit-dev libxcb-keysyms1-dev libxcb-present-dev libxcb-randr0-dev libxcb-record0 libxcb-record0-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-res0-dev libxcb-screensaver0 libxcb-screensaver0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-util0-dev libxcb-util-dev libxcb-xf86dri0 libxcb-xf86dri0-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libxcb-xinput-dev libxcb-xkb-dev libxcb-xrm0 libxcb-xrm-dev libxcb-xtest0 libxcb-xtest0-dev libxcb-xv0-dev libxcb-xvmc0 libxcb-xvmc0-dev libxext-dev libxfixes-dev libxi-dev libxine2-bin libxine2-dev libxine2-ffmpeg libxine2-misc-plugins libxine2-plugins libxkbcommon-dev libxkbcommon-doc libxkbcommon-tools libxkbcommon-x11-dev libxrender-dev libfontconfig1-dev

建议依赖都装一下,因为编译一次qt6源码得要几个小时,而缺少libqxcb.so只能重新编译(ˉ▽ˉ;)...

7.开始编译并安装

./configure -prefix /usr/bin/arm64qt6.4.0 -xplatform linux-aarch64-gnu-g++ -xcb -xcb-xlib -bundled-xcb-xinput -xkbcommon

其中-prefix为保存Qt库的路径,-xplatform为目标平台。

完成后再执行cmake,此过程需要时间较长。

cmake --build . --parallel

编译完成后进行安装

cmake --install .

最后Qt6源码库会安装在指定的目录下 

8.可以查看下编出来的源码系统架构

cd arm64qt6.4.0/lib
readelf -h libQt6Xml.so

显示系统架构为aarch64即可,具体如下:

  

9.添加到系统环境变量

vim ~/.bashrc

在最后面添加以下内容:

#add qt env
export PATH=/usr/bin/arm64qt6.4.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/bin/arm64qt6.4.0/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/usr/bin/arm64qt6.4.0/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/usr/bin/arm64qt6.4.0/qml:$QML2_IMPORT_PATH

 使环境变量立即生效

sudo -s source ~/.bashrc

三、在arm64芯片板上配置Qt6环境

1.首先查看板子上的对应配置,比如交叉编译工具链(gcc/g++)、cmake等,具体安装步骤参考一、二步骤。(当然,如果是一开始直接在板上操作就可以跳过这一步了)如果某个配置在板子上原来就有,可以查看其版本,最好与上面的版本一致,比如查看cmake版本:

cmake --version

2.安装qtcreator,默认安装的版本是5.12.8的

sudo apt-get install qtcreator

3.用U盘把编出来的qt6源码包拷贝到arm板上的/usr/bin/目录下

4.启动qtcreator

sudo qtcreator

5.配置qt6环境

工具➡选项

编译器➡添加➡GCC➡C/C++

修改如下:

Qt Versions➡添加

构建套件➡添加

添加设置如下:

6.至此,aarch64环境的qt6基本配置完毕o(* ̄▽ ̄*)ブ,可以把项目文件放到芯片板子上看看效果了,以下是本人项目构建遇到的问题,在此记录一下,没有这些问题的可以忽略。

四、配置后出现的问题及解决办法

问题1:Could NOT find XKB (missing: XKB_LIBRARY XKB_INCLUDE_DIR) (Required is at least version "0.5.0")

sudo apt install libxkbcommon-dev

问题2: libOpenGL.so.0: cannot open shared object file: No such file or directory

1.在虚拟机根目录下查找该库文件,U盘拷贝以下三个系统架构为aarch64库文件

2.进到这三个库文件的目录下,并查看这三个文件

3.复制软连接文件

sudo cp -r -L libOpenGL.so U盘目录

复制到芯片目录/usr/lib/aarch64-linux-gnu,并覆盖一下软连接

sudo ln -sf libOpenGL.so.0 libOpenGL.so
sudo ln -sf libOpenGL.so.0.0.0 libOpenGL.so.0

问题3:error: GLSL 4.50 is not supported. Supported versions are: 1.10,1.20,1.30,1.00 ES,3.00 ES,3.10 ES,and 3.20 ES

sudo vi ~/.bashrc

在最后一行添加

export MESA_GL_VERSION_OVERRIDE=4.5

问题4:运行项目时显示的中文为空白方框

1.进到虚拟机的字体目录

cd /usr/share/fonts/truetype

2.把图中的arphic复制到板子上的对应目录下(其他字体没试过),并添加到环境变量中

vi /etc/profile
export QT_QPA_FONTDIR=/usr/share/fonts/truetype/arphic

3.输入以下指令或reboot重启使环境立即生效

source /etc/profile

问题5:没有安装pcl(这里直接命令安装,默认版本是1.10的) 

sudo apt install libpcl-dev

总结:整个过程还是比较困难的,但也挺庆幸最终能实现预期效果的,中间有遗漏的步骤也请各位大佬见谅,毕竟移植系统啥的经常缺这缺那的,只能记住一些印象深的o_o ....,自行百度吧。好了,就先分享到这里ヾ( ̄▽ ̄)Bye~Bye~。

Logo

开源、云原生的融合云平台

更多推荐