解决GLIBC不兼容问题
问题背景
在交叉编译时,报了GLIBC不兼容的问题。我分析产生这个问题的原因是 ,生成库时使用的GLIBC库比当前使用的交叉编译工具链中的GLIBC库更新,导致无法兼容。
解决方案
解决这个问题的方法是下载更新的交叉编译工具链。
比如报错内容显示,库使用的最新的GLIBC库是2.29版本的,那么我们保证下载的交叉编译工具链条中带的GLIBC库是比它更新的。
确定交叉编译工具链的GLIBC版本
查看版本的方法是搜索交叉编译工具链中的libc.so.6库,右键选中它,查看它的属性,会发现它其实是一个链接,链接到其他库。比如我后面下载的交叉编译工具链中带的库的libc.so.6的属性显示,它指向libc-2.33.so,那么它的版本就是2.33。
交叉编译工具链名字解析
工具链的各个字段的含义解释如下:
- gcc
这表明该交叉编译工具链的核心编译器是 GNU Compiler Collection(GCC)。GCC 是一套广泛使用的开源编译器,支持多种编程语言,如 C、C++、Fortran 等,在软件开发领域应用非常普遍。 - arm
表示该工具链是专门为 ARM 架构处理器设计的。ARM 架构广泛应用于移动设备、嵌入式系统等领域,具有低功耗、高性能等特点。 - 10.3-2021.07
这部分体现了 GCC 编译器的版本信息。其中 10.3 是 GCC 的具体版本号,它代表了编译器的功能特性和性能水平;2021.07 表示该版本工具链的发布时间为 2021 年 7 月。不同版本的 GCC 在功能、性能和兼容性上可能会有所差异。 - x86_64
指的是该交叉编译工具链所运行的宿主系统架构。x86_64 是一种 64 位的 x86 架构,常见于台式机、笔记本电脑和服务器等设备。这意味着你可以在基于 x86_64 架构的计算机上使用这个工具链进行编译工作。 - aarch64
代表目标系统的架构。aarch64 是 64 位的 ARM 架构,表明使用这个工具链编译出来的程序将运行在采用 64 位 ARM 架构的设备上,比如一些高端的嵌入式设备、智能手机等。 - none
说明该工具链在设计上不依赖特定的嵌入式操作系统运行时环境。使用此工具链编译的程序可以在裸机环境(即没有操作系统的硬件平台)上运行,不过在这个名称中结合后面的 linux 来看,更多是表示不依赖除 Linux 内核之外的特定嵌入式运行时环境。 - linux
表示编译出来的程序将运行在 Linux 操作系统上。这意味着该工具链会针对 Linux 系统的特性和接口进行优化,生成的可执行文件能够与 Linux 内核和系统库进行交互。 - gnu
表示该工具链使用 GNU C 库(glibc)。GNU C 库是 Linux 系统中广泛使用的标准 C 库,它提供了丰富的系统调用和函数接口,使得程序能够方便地与 Linux 内核进行交互,实现各种功能。
下载交叉编译工具链
交叉编译工具链可以从两个地方下载,
一个是linaro
linaro提供的工具链下载地址
一个是ARM
ARM提供的工具链下载地址
但是只有ARM提供的工具链比较新,所以我是从ARM官网下载的。
我使用的芯片是Cortex-A55架构的,宿主机是x86架构,ubuntu系统,所以我下载的工具链是 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz