版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lc1025082182/article/details/129554635
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiangzaixiansheng/article/details/131221887
环境
CentOS7.9
NodeJS v18或v20
Error: /lib64/libm.so.6: version `GLIBC_2.27‘ not found
背景
公司项目使用nodejs18,配置好NodeJS路径后,构建时产生报错如下:
node: /lib64/libm.so.6: version `GLIBC_2.27' 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)
分析原因
使用strings命令查看当前glibc支持的版本
# 使用strings命令查看
strings /lib64/libc.so.6 | grep -E "^GLIBC_" | sort -V -r | uniq
# 查看结果如下:
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_PRIVATE
发现只能到2.17
执行ldd --version
也会看到glibc版本是2.17
解决方案
- 升级 gcc 和 glibc 版本:注意,在升级前备份重要数据,并仔细阅读相关文档和使用说明。
- 使用其他发行版:可以考虑使用其他发行版,如 Ubuntu 或 Fedora,这些发行版默认已经安装了适用于 Node.js 18 的 gcc 和 glibc 版本。
- 使用 Node.js 16:Node.js 16 是一个长期支持版本(LTS),它需要的 gcc 和 glibc 版本要求相对较低,可能与你的系统版本兼容。您可以尝试使用 Node.js 16,它可以提供类似于 Node.js 18 的功能,并在未来几年内受到支持和更新。
推荐方式
这里推荐先使用devtoolset工具进行自动安装,操作步骤如下:
- 安装 devtoolset 8:Devtoolset 8 包括更新的 GCC 和 GLIBC,可以满足 Node.js 18 的要求。使用以下命令安装 Devtoolset 8:
sudo yum install centos-release-scl -y
sudo yum install devtoolset-8 -y
- 激活 devtoolset 8:安装完成 Devtoolset 8 后,需要激活 Devtoolset 8 才能使用更新的 GCC 和 GLIBC。使用以下命令激活 Devtoolset 8:
scl enable devtoolset-8 bash
- 更新 GCC 和 GLIBC:使用 Devtoolset 8 提供的更新版本替换系统自带的 GCC 和 GLIBC。使用以下命令更新:
sudo yum install devtoolset-8-toolchain -y
sudo scl enable devtoolset-8 bash
- 验证更新版本:使用以下命令验证 GCC 和 GLIBC 版本:
gcc --version
ldd --version
# 查看gcc的安装位置:which gcc
如果显示的 GCC 版本为 8.x.x,并且显示的 GLIBC 版本为 2.28 或更高版本,则说明已成功更新。
- 再执行
node -v
命令来看看是否还有报错?
踩坑记录
执行ldd --version
后发现glibc还是2.17版本,所以需要手动升级了,附上手动升级glibc的步骤:
cd /usr/local
yum -y install bison
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.28.tar.gz --no-check-certificate
tar -xzf glibc-2.28.tar.gz
- 编译和安装:切换到源码目录并使用 configure 和 make 命令编译和安装 GLIBC:
cd glibc-2.28
mkdir build
cd build
../configure --prefix=/usr
make -j4
sudo make install
## 编译安装报一下错误不用管
You should restart this script from your build directory after you've
fixed all problems!
Btw. the script doesn't work if you're installing GNU libc not as your
primary library!
make[1]: *** [Makefile:111: install] Error 1
make[1]: Leaving directory '/usr/local/glibc-2.28'
make: *** [Makefile:12: install] Error 2
- 安装成功。
Error: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found
背景
## 安装glibc-2.28后node命令依然报错
# 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)
命令
# 查询是否有对应的GLIBC 或者 GLIBC
strings /usr/lib64/libstdc++.so.6 | grep ^GLIBCXX_
strings /usr/lib64/libstdc++.so.6|grep ^CXXABI_
# 发现最大版本是GLIBCXX_3.4.19、CXXABI_1.3.7
当然出现上面的问题,主要原因是因为gcc动态库版本过老。如果没有CXXABI_1.3.9,需要进行更新对应的libstdc++.so.6
解决办法一: 更新libstdc++.so.6.0.26
# 更新lib libstdc++.so.6.0.26
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26
# 替换系统中的/usr/lib64
# 把下载的libstdc++.so.6.0.26 cp 到 /usr/lib64/
ll /usr/lib64/libstdc++.so.6
mv libstdc++.so.6.0.26 /usr/lib64/
cd /usr/lib64/
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6