异常场景
安装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