基于CentOS更新 glibc - 解决 `GLIBC_2.29‘ not found

本文介绍了解决在CentOS Stream 8上因glibc版本过低导致的GLIBC_2.29未找到的问题。通过源代码编译安装及使用rpm包两种方式更新glibc版本。

说明

在一个 CentOS Stream8 上安装或运行某些程序时,报 `GLIBC_2.29' not found,因为系统自带的 glibc 库版本只到 glibc-2.28。

$ strings /usr/lib64/libc.so.6 | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE
GA+GLIBCXX_ASSERTIONS
GA+GLIBCXX_ASSERTIONS
GA+GLIBCXX_ASSERTIONS
...

对于在较高版本上编译的程序就需要更高版本的 glibc。所以这里尝试更新系统的 glibc。

注:这里记录的两个方法虽然最后能成功更新 glibc,但是对系统有很大的影响,谨慎使用。

源代码安装 glibc

下载源代码

wget https://ftp.gnu.org/gnu/libc/glibc-2.34.tar.gz

tar xvf glibc-2.34.tar.gz

配置环境

 glic 的编译不能在自身目录下进行,这样方便将所有生成的文件集中放置,出现问题时只要删除编译目录即可,源代码目录仍保留完整的源代码。(但编译过程还是会修改部分内容。)

cd glibc-2.34
mkdir build && cd build

../configure --prefix=/usr/local/glibc-2.34

 configure 文件有多个参数可以添加,但只有 --prefix 是必需的,它表示后续在哪个目录下安装 glibc,默认是 "/usr/local",我这里选择 "/usr/local/glibc-2.34"。

编译安装

make -j 64
make install

此时会在 /usr/local 目录下生成一个 glibc-2.34 目录,包含所有的 bin/lib/include 文件。其中 lib 目录下就有我们需要的 libc.so.6 和 libm.so.6。

导入路径

上面的操作只是生成和安装,但没有添加到环境变量中去,所以其他软件仍然找不到这些依赖文件。

由于 libc 是系统基础文件,不能轻易删除,所以这里选择将新生成的文件路径直接导入环境变量,而不是替换原有文件。但是需要注意的是绝对不能导入到系统环境变量,如 /etc/profile 等,否则系统所有命令都会出现 "Segmentation fault"。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/glibc-2.34/lib

安装包更新 glibc

 

在使用源代码无法更新的情况下,我继续尝试直接安装更新 glibc 的 rpm 包。包的下载链接为:rpm2html/rpmfind

因为我使用的 CentOS Stream8,在更新时还是谨慎一点选择 CentOS Stream 9 AppStream for x86_64 对应的包。

仅仅安装 glibc 和 glibc-devel 无法成功,因为涉及大量的依赖包。最后我下载的内容如下:

 即使如此,还是没能满足所有的依赖需求,最后还是强制安装。

sudo rpm -ivh libgcc*.rpm --force
sudo rpm -ivh libxcrypt*.rpm --force
sudo rpm -ivh glibc*.rpm --force

最后系统中将存在两个 glibc 库版本,能够使我正常运行要求高版本 GLIBC 的程序。当我以为一切大功告成时,安装新软件又出现问题,使用 dnf install ... 会出现依赖的不满足的情况,所以实际上还是没能解决问题。

总结 

前面使用源代码安装参考了 GNU C 的官方文档,文档的描述很详细,但是没有说明更新后不能使用的情况。使用 rpm 包很考验耐心,最后还是会因为包之间相互依赖而导致问题,真的很烦。

所以这篇文档的方法最后并没能完美解决问题,纯当记录,如果有人知道其他解决方案,请告知,万分感谢!

参考资料

《The GNU C Library Reference Manual》

package management - Cannot update glibc on CentOS 7 - Unix & Linux Stack Exchange

centos7 - safely upgrade glibc on CentOS 7 - Server Fault

### 解决Conda环境中缺少GLIBC_2.29的问题 当遇到`GLIBC_2.29 not found`错误时,这通常意味着当前操作系统上的glibc版本低于所需版本。对于基于Linux的操作系统而言,可以通过更新系统的glibc库来解决问题;然而,在Windows环境下使用Miniconda或Anaconda的情况下,则需采取不同的策略。 #### 方法一:创建特定Python版本环境 有时安装较新的软件包会依赖于更高版本的glibc,而这些新版本可能并不兼容旧版CentOS/RedHat等发行版中的默认glibc版本。因此可以尝试创建一个带有较低Python版本的新环境,从而避开对高版本glibc的需求: ```bash conda create -n py37 python=3.7 conda activate py37 ``` 这种方法适用于那些不需要最新功能的应用场景,并且能够有效规避因glibc版本过低引发的一系列问题[^1]。 #### 方法二:利用Docker容器化技术 如果确实需要在一个不支持最新glibc的老系统上运行某些程序,那么考虑采用Docker作为解决方案是一个不错的选择。通过构建包含适当glibc版本的基础镜像,可以在隔离环境中部署应用程序而不影响主机系统的稳定性。 例如,可以从Ubuntu 20.04 LTS这样的现代Linux发行版开始建立自己的工作环境,因为它们自带了满足需求的glibc版本: ```dockerfile FROM ubuntu:20.04 RUN apt-get update && \ apt-get install -y software-properties-common && \ add-apt-repository universe && \ apt-get update && \ apt-get install -y python3-pip COPY requirements.txt /app/ WORKDIR /app RUN pip3 install --no-cache-dir -r requirements.txt ``` 此方法特别适合开发团队协作以及持续集成流水线中使用[^2]。 #### 方法三:调整Conda渠道优先级并重新安装必要组件 考虑到网络连接状况不佳可能导致下载失败进而造成缺失关键文件(如glibc),建议先清理缓存后再重试安装操作。此外还可以临时切换至国内源以加速获取资源速度: ```bash conda clean --all conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ conda config --set show_channel_urls yes conda install libgcc-ng ``` 上述命令序列有助于确保所使用的编译器工具链是最新的,同时也解决了潜在的动态链接库冲突问题[^3]。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔底

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值