前言
有一个QT项目,当我在x86架构的Ubuntu20.04虚拟机中运行的时候,是正常的;当我要把这个QT项目生成的可执行应用程序(交叉编译套件)运行在arm64架构的ubuntu系统中,就提示错误,如下图所示。
原因
是因为qt项目中的一些文件是依赖于GLIBC_2.33,但是在arm64架构的ubuntu系统中是没有的,这就需要在arm64架构的系统中安装GLIBC_2.33,限于arm64架构的系统缺少文件较多,所以,采取在x86的Ubuntu系统中交叉编译GLIBC_2.33的方法。
解决办法
1、确保交叉编译工具链已正确安装
可以参考虚拟机Ubuntu远程调试ARM开发板中的QT程序_ubuntu qt调试-CSDN博客;
2、下载glibc需要的依赖项和配置文件,包括Linux 内核头文件、GMP等,由于我的系统中本身就存在GMP,所以这里只介绍Linux 内核头文件的安装。
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.119.tar.xz
tar -xf linux-5.4.119.tar.xz
cd linux-5.4.119
make ARCH=arm64 INSTALL_HDR_PATH=/usr/aarch64-linux-gnu headers_install
安装完以后,就会在/usr/aarch64-linux-gnu/include下看到glibc需要的Linux 内核头文件了,这个路径后面会用到。
3、下载并编译、安装glibc-2.33。
wget http://ftp.gnu.org/gnu/libc/glibc-2.33.tar.gz
tar -xzvf glibc-2.33.tar.gz
mkdir glibc-build
cd glibc-build
../glibc-2.33/configure \
--prefix=/opt/glibc-2.33
--host=aarch64-none-linux-gnu \
--with-headers=/usr/aarch64-linux-gnu/include \
其中,
--prefix 指定glibc的安装路径,安装完以后库文件就在此处。
--host指定目标系统的主机类型,即生成的二进制文件将运行的架构。这里,aarch64-none-linux-gnu 表示目标架构是 ARM 64-bit (AArch64)。
--with指定目标系统的内核头文件路径。编译 glibc 时需要使用这些头文件。此路径应该包含目标架构的内核头文件。
make -j4
make install
4、将生成的/opt/glibc-2.33下的库文件,主要是libc-2.33.so拷贝到arm架构的系统中的/lib/aarch64-linux-gnu中,并将libc.so.6软链接至libc-2.33.so,重启即可。可通过ldd --version 查看当前系统中的glibc的版本。
注意:
在将libc-2.33.so拷贝到arm架构的系统中的/lib/aarch64-linux-gnu中之前,不要轻易删除系统中之前的版本libc-2.31.so等以及libc.so.6,否则板子容易变砖。