开发环境:虚拟机ubuntu20.04 x86
目标板环境:arm
最近在将项目移植到arm开发板上运行,需要将项目编译成arm版本。在qt配置交叉编译环境时,添加qmake报错。根据报错提示在网上搜到的相关资料都比较少,于是便写篇文章记录下来。

可能原因一:ubuntu不兼容32位qmake
根据这篇博客:qtcreator中添加qmake出现the qmake executable xxx could not be added-CSDN博客
可能原因是ubuntu不兼容32位qmake,即ubuntu是64位,qmake是32位。
于是通过file命令查看交叉工具链中qmake的信息,如下
再查看ubuntu的信息
可以看到ubuntu和qmake都是x86的,排除这个原因。
根本原因:交叉编译qmake时所依赖的glibc库版本过高
在查看交叉工具链中的qmake信息时出现如下提示:../qmake libc.so.6: version `GLIBC_2.33' not found (required by...)

bash
embedsky@ubuntu:/opt/EmbedSky/TQ3568/aarch64-embedsky-linux-gnu/sysroot/usr/local/Qt-5.15.4/bin$ /opt/EmbedSky/TQ3568/aarch64-embedsky-linux-gnu/sysroot/usr/local/Qt-5.15.4/bin/qmake -v
/opt/EmbedSky/TQ3568/aarch64-embedsky-linux-gnu/sysroot/usr/local/Qt-5.15.4/bin/qmake: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /opt/EmbedSky/TQ3568/aarch64-embedsky-linux-gnu/sysroot/usr/local/Qt-5.15.4/bin/qmake)
/opt/EmbedSky/TQ3568/aarch64-embedsky-linux-gnu/sysroot/usr/local/Qt-5.15.4/bin/qmake: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /opt/EmbedSky/TQ3568/aarch64-embedsky-linux-gnu/sysroot/usr/local/Qt-5.15.4/bin/qmake)
出现这个报错的原因,是因为执行qmake所依赖的glibc版本高于当前系统的glibc版本。
在执行qmake时,需要的 glibc 版本中带有 GLIBC_2.33 和 GLIBC_2.34 这两个符号版本(可以通过ldd命令查看),意味着运行qmake需要依赖的glibc版本为GLIBC_2.33 和 GLIBC_2.34。而当前动态链接器找到了系统(20.04)自带的 gilbc库。而当前系统的 glibc 版本低于这两个版本,找不到对应符号版本,所以出现报错。(不同的ubuntu版本所使用的glibc库都是有条件的,比如20.04所支持的glibc版本最高为GLIBC_2.31)
再查看当前开发环境(20.04)的gilbc版本,发现其版本为GLIBC_2.31,确实低于执行qmake所需的glibc版本。
但还是不确定是不是因为这个原因导致在qt中添加qmake失败。在一番寻找无果后于是带着问题以及上面的信息去请教了同事,得到了他的确定------就是glibc版本的问题。因为交叉编译工具链是在ubuntu22.04上编译的,所用到glibc库版本较高,与当前开发环境不兼容,所以导致qmake添加失败。他给了两个解决思路:
(1)在ubuntu20.04的环境下重新编译交叉工具链,使qmake依赖较低版本的gilbc,适配当前的开发环境
(2)在22.04环境上进行开发,这样在使用交叉工具链时就会依赖更高版本的gilbc库
最终选择了第二个方案,成功在qt中添加qmake
总结:本次报错所提示的信息比较少,只有一个"The qmake executable xxx/qmake could not be added:",搜到的相关资料很少。即便是发现执行qmake所需的gilbc版本过高,也不能确定(或者说也没有意识到)是这个原因导致的qmake添加失败,最后只得去请教同事。
其实可以先根据这个思路去验证下是不是这个原因导致的qmake添加失败,虽然请教有经验的同事会比较快,但有些坑还是需要自己去踩的。