/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版本太低,不是特别需要的情况下,请不要自行升级。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)