首先指路参考的原博客:Ubuntu系统anaconda报错version `GLIBCXX_3.4.30' not found - Angry_Panda - 博客园
本篇仅作为报错解决的学习记录。
1、首先,这个报错是什么意思?
这个错误表示你在运行 paddle
库时,libpaddle.so
(PaddlePaddle 的核心动态链接库)需要的 GLIBCXX_3.4.30
版本没有在 libstdc++.so.6
库中找到。
错误分析:
1、首先查看系统目录(根目录下)下有多少个C++标准库libstdc++.so.6文件。
使用命令sudo find / -name libstdc++.so.6,
--> 关于find命令,详见Linux中find命令用法大全 - 许卿一世长安 - 博客园
得到结果:
首先关注 (1)anaconda主环境(即base环境)的库文件夹,即anaconda3/lib;(2)我的虚拟环境pd下的lib文件夹;(3)系统环境下的lib文件夹。
!!!我们需要知道:如果你正在使用 Anaconda 环境,Anaconda 会优先使用它自己的环境路径中的库文件。即我这里/home/ubuntu2004/anaconda3/envs/pd/lib/libstdc++.so.6
会被 paddle
库优先加载,而不管其他环境下有没有符合需求的libstdc++.so.6
文件。
猜测:可能是这个库文件没有所需要的GLIBCXX_3.4.30
版本。
检验猜测:输入命令: strings /home/ubuntu2004/anaconda3/envs/pd/lib/libstdc++.so.6 | grep GLIBC
可以看到确实最高版本只有到3.4.29。所以会报错找不到,猜测正确。接下来只需要升级就好。
在此之前,先好奇地查看下前面说的其他路径下的文件是否有所需要的GLIBCXX_3.4.30
版本:
依次输入:strings /home/ubuntu2004/anaconda3/lib/libstdc++.so.6 | grep GLIBC; strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBC
得到结果如下:
可以发现anaconda的主环境下的libstdc++.so.6
库依旧没有所需版本,但系统环境下有!!
所以,快速解决方法:通过符号链接(软连接)将虚拟环境pd中的 libstdc++.so.6
库文件直接链接到系统环境中的 libstdc++.so.6
。
在我的虚拟环境的lib路径下依次输入命令:
rm libstdc++.so
rm libstdc++.so.6
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so.6
# 这里的后缀0.30表示/libstdc++.so.6的第30个版本
结束,再运行之前报错的命令,完美解决!!不报错了!!!
上述软链接操作的解释(学习过程):
在/home/ubuntu2004/anaconda3/envs/pd/lib/下发现两个 libstdc++.so
库文件,其中libstdc++.so
是 libstdc++.so.6
的符号链接,GPT回答我说
这个链接是为了方便不同版本的 C++ 库的兼容性管理。
直观来看,查看文件类型,SO文件没有具体的版本号,直观知道它是作为通用名称使用的,这里就是指向 libstdc++.so.6
这个有具体版本的实际库文件。怎么知道是指向libstdc++.so.6的呢?
采用命令ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so
结果:
(上述的libstdc++.so.6.0.29
没有显示完整路径 ,说明它是相对路径,所以就是前面图中红框内的libstdc++.so.6
。)
然而,我查看系统环境下,发现只有libstdc++.so.6 文件,而没有libstdc++.so软链接
,这是因为系统更倾向于直接使用 libstdc++.so.6
作为库的实际实现。(所以,libstdc++.so
在系统级别通常并不会直接存在。)
我个人感觉,既然libstdc++.so是libstdc++.so.6的软连接,直接把虚拟环境下的libstdc++.so.6软连接到系统环境下的不就好了,然后libstdc++.so可以通过两次软连接同样跳到系统环境下的libstdc++.so.6。为什么要直接将libstdc++.so也直接软连接到系统环境下的libstdc++.so.6。(GPT说我这样也是可以的,那不管了)
命令行相关参数解释:
1、strings命令:linux 中 strings命令的作用和例子_linux strings-CSDN博客,注意和cat命令的区别。
2、grep文本搜索命令用法:grep命令_Linux grep命令:文本搜索工具(可使用正则表达式) - C语言中文网
3、在命令行中,|
是一个 管道符(pipe),它将前一个命令的输出传递给后一个命令作为输入。管道符的作用是将一个命令的标准输出(stdout)直接连接到另一个命令的标准输入(stdin)。
4、关于软链接(符号链接),详见:linux ln 命令使用参数详解(ln -s 软链接)_LINUX_操作系统_脚本之家