/lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found

原因

使用的gcc没有找到对应的glib库。

每个版本的glib都会有改变,所以使用的时候必须匹配。

大部分是因为自己编译升级了gcc,再用新的gcc编译程序时没有找到当时匹配的类库。

查找原因

报错提示很明确了,/lib64/libstdc++.so.6中没有找到GLIBCXX_3.4.26版本内容。正常情况/lib64/libstdc++.so.6并不是具体文件,而是软连接,可以通过ls -la查看,大部分连接到当前目录下的类库,比如libstdc++.so.6.0.24

也可以通过如下命令查看该类库下支持到哪个版本

strings /usr/lib64/libstdc++.so.6|grep GLIBCXX
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
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_DEBUG_MESSAGE_LENGTH

可以看到是3.4.24,最后的编号24与lib库libstdc++.so.6.0.24最后的编号是一致的。

解决方法

既然lib库与glib版本是有规律的,所以理论上我们应该在系统中查找libstdc++.so.6.0.26文件(或者比26更高的类库),大部分都应该能找到,如果没找到,要么到网上下一个,要么自己再编译一遍gcc。

编译安装的类库,除非特殊指明,大部分都在/usr/local/lib64/目录下,但是编译查找的目录大部分是/usr/lib64/。所以要么指定加载路径为/usr/local/lib64/;要么把类库拷贝到/usr/lib64/

cp /usr/local/lib64/libstdc++.so.6.0.28 /usr/lib64/
mv /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6.0.24_bak
ln -s /usr/lib64/libstdc++.so.6.0.28 /usr/lib64/libstdc++.so.6

经过如上操作,再编译,理论上不会再报错

/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found

出了c++的库,我们还经常会遇到c的库的问题。
如上表示缺少2.29版本,我们可以用同样的方法看一下系统当前已有的glibc

strings /lib/x86_64-linux-gnu/libc.so.6|grep GLIBC   
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_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE
GNU C Library (Debian GLIBC 2.28.21-1+deepin-1) stable release version 2.28.

如上,可以看出,确实缺少2.29,最高只有2.28。

我们可以从官方下载2.29的版本,编译安装

wget https://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
tar -zxvf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build_dir
cd build_dir
sudo ../configure --disable-sanity-checks
sudo make
sudo make install

这里默认会安装到/usr/local/lib下,千万要注意,不可以直接用新的glibc连接到/lib/x86_64-linux-gnu/libm.so.6,因为这是非常底层的库,如果有问题会导致整个系统挂掉。我在升级时就遇到了问题,最后用启动盘又重新连接了回来。

如果你安装完,运行程序,还是找不到最新的库,是因为默认查找的路径/lib/x86_64-linux-gnu/libm.so.6确实没有,可以使用其他方法,把最新的库加入到系统搜索环境中。这一步我没有继续操作,因为系统差一点挂掉,软件升不升级也无所谓了。

很多时候glib都是与系统一起升级的,因为关联很多。所以如果系统的glib版本太低,不是特别需要的情况下,请不要自行升级。

posted @ 2023-08-07 13:22  秋来叶黄  阅读(1717)  评论(0编辑  收藏  举报