因为业务需要,公司的服务器需要用到nodeV18版本,所以直接使用版本管理器n升级了一下node的版本。结果在升级node的时候发生了以下报错:
搜索了一下报这个错误是因为glibc的版本太低,node18已经不支持了。
用命令行查看了一下服务器当前的系统版本:
[root@zkzn139 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
在看一下当前服务器的GLIBC版本:
[root@zkzn139 ~]# 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.17,不符合上面报错信息里提示的版本2.28,所以决定升级glibc.
- 先下载升级glibc:
cd /opt/ #一般来说下载的文件统一放在这个目录下,当然也可以选在放在其他目录下
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz --no-check-certificate
tar -xzvf glibc-2.28.tar.gz
cd glibc-2.28
mkdir build && cd build #一定要单独建个文件夹来build
- 在编译开始前,修改
scripts/test-installation.pl128行,增加&& $name ne "nss_test2",以避免编译错误 nss_test2报错。 - 接下来执行configure命令,需要注意加--enable-obsolete-nsl,解决
undefined reference to '_nsl_default_nss@GLIBC_PRIVATE'
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --enable-obsolete-nsl
- 然后命令行执行
make开始构建,结果发现又报了下面这个错:
- 根据报错信息,我们分别升级一下make、bison、以及gcc。升级make和gcc版本的教程我放在了下面两篇文章里,可以直接查看(注意需要先升级make,在升级其他的):
- 最后在升级bison
#直接使用yum安装bison
yum install bison
- 所有依赖项升级完成后,重新执行上面的configure命令:
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --enable-obsolete-nsl
8.再分别执行构建和安装命令,注意这里make的执行时间比较长,大约半小时到一小时起步:
make 或者 make -j4 (4个线程并发跑,时间会快一点)
make install
- 最后用
strings /lib64/libc.so.6 | grep GLIBC或者是ldd --version检查glibc的版本:,会发现最高的glibc版本已经支持到2.28了,这时再使用n安装node18就可以了。
[root@iZ2ze8iob5572xlhmkvso8Z opt]# 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.
这时候安装node18还是报错找不到glibc3.4.21,我们在用命令行查询下:
发现动态库里的版本还是之前的版本没有变化,查找一下编译gcc时生成的最新动态库的存放位置:
[root@iZ2ze3jwkmtl0ixlnns1yvZ lib64]# find / -name "libstdc++.so*"
/root/local/lib64/libstdc++.so.6.0.25-gdb.py
/root/local/lib64/libstdc++.so.6.0.25
/root/local/lib64/libstdc++.so
/root/local/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/lib64/libstdc++.so.6.0.25
/usr/lib64/libstdc++.so.6
/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/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/libstdc++.so.6.0.25
/usr/lib/libstdc++.so.6
/opt/gcc-8.5.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/opt/gcc-8.5.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/opt/gcc-8.5.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/opt/gcc-8.5.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/opt/gcc-8.5.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/opt/gcc-8.5.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/opt/gcc-8.5.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/opt/gcc-8.5.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/opt/gcc-8.5.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
会发现之前将动态库放到了这里:/root/local/lib64/libstdc++.so.6.0.25,下面我们就拷贝文件到lib目录,并重新建立软链接:
1. # cp /root/local/lib64/libstdc++.so.6.0.25 /usr/lib64/
1. # rm libstdc++.so.6
1. # ln -sf /usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6
再次使用strings /usr/lib64/libstdc++.so.6 |grep GLIBC查询会发现动态库已经更新。