文章目录[隐藏]
最近在运行一个Linux平台的程序的时候启动报错了:
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
出现这个错误是因为CentOS7当前版本默认的GCC的版本太老,里面的动态链接库没有GLIBCXX_3.4.21。接下来就是我分析,解决这个问题的过程,记录下来给别人也给自己做个记录
1. 确认系统中已有的 libstdc++.so.6
文件
首先执行命令检查动态库:
$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC
输出结果如下:
[root@localhost lib]# 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
-
GLIBC_2.3
-
GLIBC_2.2.5
-
GLIBC_2.14
-
GLIBC_2.4
-
GLIBC_2.3.2
-
GLIBCXX_DEBUG_MESSAGE_LENGTH
可以看出我的最高版本是3.4.19。
如果输出中没有 GLIBCXX_3.4.21
,说明需要升级。
输入命令查看libstdc++.so.6的位置
$ find / -name libstdc++.so.6*
输出结果如下:
-
[root@localhost lib]# find / -name “libstdc++.so*”
-
/root/Downloads/vmware-tools-distrib/lib/lib64/libstdc++.so.6
-
/root/Downloads/vmware-tools-distrib/lib/lib64/libstdc++.so.6/libstdc++.so.6
-
/root/Downloads/vmware-tools-distrib/lib/lib32/libstdc++.so.6
-
/root/Downloads/vmware-tools-distrib/lib/lib32/libstdc++.so.6/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/lib/vmware-tools/lib64/libstdc++.so.6
-
/usr/lib/vmware-tools/lib64/libstdc++.so.6/libstdc++.so.6
-
/usr/lib/vmware-tools/lib32/libstdc++.so.6
-
/usr/lib/vmware-tools/lib32/libstdc++.so.6/libstdc++.so.6
-
/usr/lib/libstdc++.so.6
-
/usr/lib/libstdc++.so.6.0.19
-
/usr/lib64/libstdc++.so.6.0.19
-
/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/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.py
-
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.pyc
-
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.19-gdb.pyo
-
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libstdc++.so
-
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libstdc++.so
可见我的最高版本文件是libstdc++.so.6.0.19
接下来就需要进行升级了,首先下载GCC源码,选择合适自己的版本,我下载的7.3.0。
2. 下载并编译安装更高版本的 libstdc++
2.1 下载 GCC 源码
这是GCC下载地址,里面有各个版本的源码 http://ftp.gnu.org/gnu/gcc/
wget https://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz
tar -zxvf gcc-7.3.0.tar.gz
cd gcc-7.3.0
2.2 安装依赖
安装编译环境
sudo yum groupinstall "Development Tools" sudo yum install gmp-devel mpfr-devel libmpc-devel zlib-devel
2.3 编译并安装
然后就是进入源码目录开始进行编译了,下面是连续的几个命
./contrib/download_prerequisites mkdir build && cd build ./configure --prefix=/usr/local/gcc-7.3.0 --enable-languages=c,c++ --disable-multilib make -j$(nproc) sudo make install
生成make文件并且编译,此处编译时间比较久
3. 替换系统中的 libstdc++.so.6
文件
查找编译gcc时生成的最新动态库:
# find / -name "libstdc++.so*"
将新编译的
libstdc++.so.6
文件替换系统中的旧文件,并更新软链接:sudo cp /usr/local/gcc-12.3.0/lib64/libstdc++.so.6.0.30 /usr/lib64/
sudo rm /usr/lib64/libstdc++.so.6
sudo ln -s /usr/lib64/libstdc++.so.6.0.30 /usr/lib64/libstdc++.so.6
sudo ldconfig
4. 验证升级是否成功
检查是否包含
GLIBCXX_3.4.21
:strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
如果输出中包含
GLIBCXX_3.4.21
,则说明升级成功。