解决类似 Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit)的问题

本文介绍了因GCC升级导致的动态库版本不匹配问题及解决方案。通过查找并替换最新的动态库文件,解决了编译后的程序运行时遇到的版本错误。

源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

1. 问题原因分析

为了安装最新版本的Node.js(最新版本的Node.js使用了C++ 11中,而C++ 11需要code>gcc 4.8+才能支持),将gcc升级到了当前最新版本v 5.2.0。升级后,成功编译安装了新版本的Node.js(v 4.2.1),但运行时程序时出现了以下错误:

node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)

运行以下命令检查动态库:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

输出结果如下:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

从以上输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。

2. 问题处理

执行以下命令,查找编译gcc时生成的最新动态库:

find / -name "libstdc++.so*"

输出如下:

/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21  //最新动态库
……

/home/gcc-5.2.0/gcc-temp升级gcc时的输出目录。

将上面的最新动态库libstdc++.so.6.0.21复制到/usr/lib64目录下:

cp /home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64

复制后,修改系统默认动态库的指向,即:重建默认库的软连接。

切换工作目录至/usr/lib64

cd /usr/lib64

删除原来软连接:

rm -rf libstdc++.so.6

将默认库的软连接指向最新动态库:

ln -s libstdc++.so.6.0.21 libstdc++.so.6

默认动态库升级完成。重新运行以下命令检查动态库:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

现在输出如下:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
<think>我们面对的问题是在CentOS 7上安装Node.js 18.20.8时出现缺少GLIBC和GLIBCXX等依赖库的错误。CentOS 7自带的glibc版本较低(2.17),而Node.js 18需要至少glibc 2.28以上。因此,我们需要升级glibc和相关库。但请注意,直接升级系统glibc可能会影响系统稳定性,因为很多系统程序依赖于glibc。所以,我们有两种选择: 1. 在CentOS 7上升级glibc(风险较高,需谨慎) 2. 使用其他方式安装Node.js,例如利用nvm编译安装(可能会自动处理依赖,但同样需要高版本glibc)或者升级操作系统到CentOS 8以上(推荐)。 考虑到用户明确要求安装Node.js 18.20.8,并且希望继续使用CentOS 7,我们只能选择升级glibc。但必须强调:升级glibc可能导致系统不稳定,甚至无法启动。建议在生产环境之前先在测试环境尝试。 步骤概述: 1. 检查当前glibc和libstdc++版本 2. 下载并编译安装glibc 2.28(或更高版本) 3. 更新libstdc++.so.6(如果也需要升级) 4. 验证安装的Node.js 但是,根据引用[3]的建议,也可以考虑升级到CentOS 8以上系统,因为CentOS 8自带的glibc版本较高(2.28),可以避免手动升级glibc的风险。 由于用户坚持在CentOS 7上安装,以下提供升级glibc的步骤(请务必在测试环境先操作): 注意:以下操作需要root权限,并且操作过程中不能中断,否则可能导致系统命令不可用。 步骤1:检查当前glibc版本 ```bash ldd --version ``` 步骤2:安装必要的开发工具 ```bash yum groupinstall -y "Development Tools" yum install -y bison ``` 步骤3:下载并编译安装glibc 2.28 ```bash cd /usr/local/src wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz tar -zxvf 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 make -j$(nproc) make install ``` 注意:`--prefix=/usr` 表示我们将替换系统的glibc,这是非常危险的操作。如果不想替换系统glibc,可以安装到其他目录(如`/opt/glibc-2.28`),然后通过设置环境变量`LD_LIBRARY_PATH`来让Node.js使用新版本的glibc。但是这样可能会带来其他问题。 替代方案(安装到独立目录): ```bash ../configure --prefix=/opt/glibc-2.28 make -j$(nproc) make install ``` 然后设置环境变量: ```bash export LD_LIBRARY_PATH=/opt/glibc-2.28/lib:$LD_LIBRARY_PATH ``` 这样,我们可以将Node.js安装在这个环境下运行。但是,需要确保每次运行Node.js时都设置这个环境变量。 步骤4:验证glibc版本 ```bash /opt/glibc-2.28/lib/ld-2.28.so --version # 或者如果是替换系统glibc,则直接运行: ldd --version ``` 步骤5:升级libstdc++ 我们可能还需要升级libstdc++,因为Node.js 18也需要高版本的libstdc++。CentOS 7默认的libstdc++版本较低,我们可以通过安装devtoolset来升级。 安装devtoolset-10(包含较新的GCC和libstdc++): ```bash yum install centos-release-scl yum install devtoolset-10 ``` 启用devtoolset-10: ```bash scl enable devtoolset-10 bash ``` 这样,当前会话就会使用新的工具链,包括新的libstdc++.so。但是,我们需要让这个设置永久生效,或者将新的libstdc++.so链接到系统库路径。 永久启用devtoolset-10的方法:将以下内容添加到`~/.bashrc`或`/etc/profile` ```bash source /opt/rh/devtoolset-10/enable ``` 步骤6:安装Node.js 现在,我们可以尝试安装Node.js 18.20.8。我们可以通过NodeSource安装预编译的二进制包,或者下载二进制包直接解压。 方法一:使用NodeSource仓库(推荐) 添加NodeSource仓库并安装: ```bash curl -fsSL https://rpm.nodesource.com/setup_18.x | bash - yum install -y nodejs ``` 方法二:下载二进制包 从Node.js官网下载编译好的Linux二进制包(x64),然后解压到指定目录,并设置环境变量。 ```bash wget https://nodejs.org/dist/v18.20.8/node-v18.20.8-linux-x64.tar.xz tar xf node-v18.20.8-linux-x64.tar.xz -C /usr/local ln -s /usr/local/node-v18.20.8-linux-x64/bin/node /usr/local/bin/node ln -s /usr/local/node-v18.20.8-linux-x64/bin/npm /usr/local/bin/npm ``` 注意:如果使用独立目录的glibc,则运行Node.js时需要指定LD_LIBRARY_PATH: ```bash export LD_LIBRARY_PATH=/opt/glibc-2.28/lib:$LD_LIBRARY_PATH /usr/local/bin/node -v ``` 步骤7:验证Node.js运行 ```bash node -v npm -v ``` 如果仍然报错,可以使用ldd命令查看依赖情况: ```bash ldd /usr/local/bin/node ``` 注意:如果使用独立目录的glibc,则需要使用新glibc的ldd: ```bash /opt/glibc-2.28/lib/ld-2.28.so /usr/local/bin/node ``` 由于升级glibc非常危险,强烈建议考虑升级操作系统到CentOS 8或更高版本,或者使用容器技术(如Docker)来运行Node.js 18。 相关问题: §§相关问题§§ 1. 如何在CentOS 7上安全升级glibc而不影响系统稳定性? 2. 使用Docker在CentOS 7上运行Node.js 18的方法是什么? 3. 如何编译安装Node.js 18以兼容CentOS 7的旧glibc版本? 4. 升级到CentOS 8的步骤是什么? 注意:根据引用[2]和[3]的提示,我们也可以尝试从源码编译Node.js,但同样需要高版本的glibc。因此,在CentOS 7上安装Node.js 18最安全的方式是使用Docker容器。 如果用户接受使用Docker,那么可以避免升级glibc的风险。步骤如下: 1. 安装Docker ```bash yum install -y docker systemctl start docker systemctl enable docker ``` 2. 拉取Node.js 18的Docker镜像 ```bash docker pull node:18.20.8 ``` 3. 运行Node.js容器 ```bash docker run -it --rm node:18.20.8 node -v ``` 4. 将容器用于开发或部署 这样,即使宿主机是CentOS 7,也可以运行Node.js 18。 综上所述,我们提供了两种解决方案:升级glibc(风险高)和使用Docker(推荐)。用户可根据实际情况选择。 </think>### 在 CentOS 7 上安装 Node.js 18.20.8 的解决方案 #### 问题分析 报错提示缺少 `GLIBC_2.28` 和 `GLIBCXX_3.4.20`,这是因为: 1. CentOS 7 默认 GLIBC 版本为 2.17(通过 `ldd --version` 可验证) 2. Node.js 18 需要 GLIBC ≥ 2.28 和 GCC ≥ 8(提供 GLIBCXX_3.4.20) 3. 直接升级系统 GLIBC 风险高(可能导致系统崩溃) --- ### ✅ 推荐解决方案:使用 Docker(安全高效) ```bash # 1. 安装 Docker sudo yum install -y docker sudo systemctl start docker # 2. 拉取 Node.js 18.20.8 镜像 docker pull node:18.20.8 # 3. 运行容器(示例) docker run -it --rm -v $(pwd):/app -w /app node:18.20.8 node your-script.js ``` **优点**: - 完全隔离环境,不影响系统稳定性 - 无需升级系统库 - 支持任意 Node.js 版本 --- ### ️ 备选方案:源码编译(高风险) > 如需直接安装在宿主机,需升级开发工具链: #### 步骤 1:安装高版本 GCC ```bash # 安装 SCL 仓库 sudo yum install -y centos-release-scl # 安装 GCC 11(提供 GLIBCXX_3.4.20) sudo yum install -y devtoolset-11-gcc* # 激活新工具链 scl enable devtoolset-11 bash ``` #### 步骤 2:安装 Node.js 18.20.8 ```bash # 下载源码 wget https://nodejs.org/dist/v18.20.8/node-v18.20.8.tar.gz tar xzf node-v18.20.8.tar.gz cd node-v18.20.8 # 编译安装 ./configure make -j$(nproc) sudo make install ``` #### 步骤 3:验证安装 ```bash node -v # 应显示 v18.20.8 npm -v # 检查依赖 ldd $(which node) | grep -iE &#39;glibc|stdc++&#39; ``` --- ### ️ 重要警告 1. **GLIBC 升级风险**: CentOS 7 的核心服务(如 `yum`, `ssh`)依赖原生 GLIBC 2.17,强行升级可能导致系统崩溃[^3]。 2. **替代方案优先级**: $$ \text{Docker} > \text{编译安装} \gg \text{升级系统 GLIBC} $$ 3. **生产环境建议**: - 迁移到 CentOS 8+ / AlmaLinux 8+ - 使用 Kubernetes 容器化部署 - 通过 NVM 管理多版本(需先解决 GCC 依赖) --- ### 📍 验证 GLIBCXX 兼容性 ```bash # 检查当前支持的 GLIBCXX 版本 strings /lib64/libstdc++.so.6 | grep GLIBCXX # 输出应包含 GLIBCXX_3.4.20 # 若缺失,需重新链接新版本: sudo ln -sf /opt/rh/devtoolset-11/root/lib/gcc/x86_64-redhat-linux/11/libstdc++.so.6 /lib64/libstdc++.so.6 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lxr1908

用钱砸我

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

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

打赏作者

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

抵扣说明:

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

余额充值