解决兼容性异常:/lib64/libc.so.6: version GLIBC_2.28 not found version GLIBCXX_3.4.21

异常场景

安装Centos7最小化版本后,安装Node.Js最新版,执行node -v出现如下异常:

bash 复制代码
[root@master ~]# node -v
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by node)

安装NodeJS过程

下载、解压、重命名

访问NodeJS官网下载需要的版本

bash 复制代码
wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz

tar -xf node-v20.10.0-linux-x64.tar.xz

mv node-v20.10.0-linux-x64 node

配置环境变量

vim /etc/profile

bash 复制代码
export NODE_HOME=/usr/local/node
export PATH=$PATH:$NODE_HOME/bin

使之生效:source /etc/profile

测试查看版本:

bash 复制代码
root@master:~# node -v
v20.10.0
root@master:~# npm -v
10.2.3

异常分析解决

正常来说,如上安装NodeJS过程方式安装Node.Js完全没问题,但是今天遇到了这个异常。

异常提示指出:

Node.Js需要GLIBC_2.28版本,但是系统没有该版本的支持,只有低版本的GLIB版本

Node.Js需要GLIBCXX_3.4.21版本,但是系统没有该版本的支持,只有低版本的GLIBCXX版本

解决GLIBC版本异常

查看系统中安装的 GLIBC(GNU C Library)的版本:

也可以使用strings /lib64/libc.so.6 |grep GLIBC_命令查看

bash 复制代码
[root@master ~]# ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
由 Roland McGrath 和 Ulrich Drepper 编写。

根据提示 安装所需要的GLIBC_2.27

bash 复制代码
wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz

tar xf glibc-2.28.tar.gz 

cd glibc-2.28/ && mkdir build  && cd build

../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

预编译出现异常:

bash 复制代码
configure: error: 
*** These critical programs are missing or too old: make compiler
*** Check the INSTALL file for required versions.

升级gcc与make

bash 复制代码
# 升级GCC(默认版本4.x 升级为8.x)
yum install -y centos-release-scl
yum install -y devtoolset-8-gcc*
mv /usr/bin/gcc /usr/bin/gcc-4
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++

# 升级 make(默认版本3.x 升级为4.x)
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz

tar -xzvf make-4.3.tar.gz && cd make-4.3/

./configure  --prefix=/usr/local/make

make && make install

cd /usr/bin/ && mv make make.bak

ln -sv /usr/local/make/bin/make /usr/bin/make

然后再次执行

bash 复制代码
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

没有异常则正式执行安装操作

bash 复制代码
make && make install

安装成功后,再次查看GLIBC版本信息

bash 复制代码
[root@master ~]#  ldd --version
ldd (GNU libc) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

解决CXXABI版本异常

GLIBC版本差异解决后,再次执行node版本验证,仍然出现异常,但是异常减少:

bash 复制代码
[root@master lib64]# node -v
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)

检查动态库:

可以发现动态链接库确实没有GLIBCXX_3.4.21

bash 复制代码
[root@master ~]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

查看libstdc++.so.6的位置

最高版本文件是libstdc++.so.6.0.19

bash 复制代码
[root@master ~]# find / -name "libstdc++.so*"
/root/.cache/space/dev/f2aed1caf4cc3_ideaIU-233.13135.65/plugins/remote-dev-server/selfcontained/lib/libstdc++.so.6
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/32/libstdc++.so
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.so

升级GCC

bash 复制代码
wget https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz

tar -zxvf gcc-7.5.0.tar.gz

cd gcc-7.5.0

mkdir build && cd build

# 生成make文件并且编译
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

# 编译与安装
make && make install

安装完成后,GLIBCXX是没有更新的,需要更新软连接,再次查看libstdc++.so.6的位置,可以发现最高版本文件是libstdc++.so.6.0.24

bash 复制代码
[root@master build]#  find / -name "libstdc++.so*"
/root/.cache/space/dev/f2aed1caf4cc3_ideaIU-233.13135.65/plugins/remote-dev-server/selfcontained/lib/libstdc++.so.6
/root/gcc-7.5.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24
/root/gcc-7.5.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/gcc-7.5.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/gcc-7.5.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24
/root/gcc-7.5.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/gcc-7.5.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/gcc-7.5.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24
/root/gcc-7.5.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/gcc-7.5.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/local/lib64/libstdc++.so.6.0.24
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.24-gdb.py
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/32/libstdc++.so
/opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.so

拷贝文件到lib目录,并重新建立软链接:

bash 复制代码
cp /usr/local/lib64/libstdc++.so.6.0.24 /usr/lib64/

rm /usr/local/lib64/libstdc++.so.6

ln -sf /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6

查看GLIBCxx信息,发现GLIBCXX的版本到了3.4.24

bash 复制代码
[root@master lib64]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24

验证Node.Js安装情况

bash 复制代码
[root@master ~]# node -v
v20.10.0
[root@master ~]# npm -v
10.2.3
相关推荐
孤客网络科技工作室1 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
AndyFrank2 小时前
mac crontab 不能使用问题简记
linux·运维·macos
筱源源3 小时前
Kafka-linux环境部署
linux·kafka
算法与编程之美3 小时前
文件的写入与读取
linux·运维·服务器
xianwu5434 小时前
反向代理模块
linux·开发语言·网络·git
Amelio_Ming4 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
Ven%5 小时前
centos查看硬盘资源使用情况命令大全
linux·运维·centos
~甲壳虫5 小时前
说说webpack中常见的Plugin?解决了什么问题?
前端·webpack·node.js
~甲壳虫5 小时前
说说webpack中常见的Loader?解决了什么问题?
前端·webpack·node.js