libstdc++.so.6: version `GLIBCXX_3.4.30' not found 的几个解决思路

libstdc++.so.6: version `GLIBCXX_3.4.30' not found 的几个解决思路

funnywii 303 2024-01-03

写在前面

https://funnywii.com/archives/howtoavoidbefuckedbynvidia 我在这篇文章里提了一嘴找不到GLIBCXX的相关问题。但我已经忘记问题是如何发生的了。。。

而且这次的问题是出现在新情景:我开始学习和使用Paddle。在conda环境中使用pip安装好支持CUDA12.0的Paddle后,import paddle时出现libstdc++.so.6: version `GLIBCXX_3.4.30' not found这个问题。

根据网上的资料,Paddle编译是使用 gcc12,但是我们大部分Ubuntu20.04系统中默认安装的gcc是9.4.0。

看到这里先别急着升级gccg++,因为系统可能hold不住。

方法1

根据 https://github.com/PaddlePaddle/Paddle/issues/56047 中的建议,使用命令conda install -c conda-forge gcc=12.2.0可以解决问题,但没解决我的问题。

这个命令的意义是,把你conda环境的gcc更新到 12.2.0,不过在我安装后,在conda中启动环境,并输入python后,依然显示:

(paddle_env) funnywii@4060Ti:~$ python
Python 3.8.18 (default, Sep 11 2023, 13:40:15) 
[GCC 11.2.0] :: Anaconda, Inc. on linux

说明gcc版本仍然是 11.2。遂放弃。不过也可以尝试 “修改conda默认gcc” 的思路,我没试。

方法2

要知道,无论是系统 /lib/x86_64-linux-gnu路径下,还是/usr/lib/x86_64-linux-gnu下的.so文件,只要不带小版本号的,都是软链接。

因此可以看到:

funnywii@4060Ti:~$ ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6
lrwxrwxrwx 1 root root 19 7月  11 16:50 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.28

也就是libstdc++.so.6指向了libstdc++.so.6.0.28

GLIBCXX应该就在其中。输入 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX来查看.so文件中和GLIBCXX有关的内容,得到如下结果:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
...依次类推
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_TUNABLES
GLIBCXX_DEBUG_MESSAGE_LENGTH

也就是说,其中没有我们需要的GLIBCXX_3.4.30,那么网络上很多修改软链接的方法就无效了,比如 https://blog.csdn.net/bohrium/article/details/126546521

如果你已经尝试了很多方法,应该发现你的anaconda中也是有libstdc++.so.6的,查看它的软链接,指向了一个名为libstdc++.so.6.0.32的文件。。。然后你或许想修改系统 /lib/x86_64-linux-gnu中的软链接,直接链接到anaconda里。这个方法我也试了,但是系统崩了。 我的firefox不能打开新的tab,我的回收站也打不开了。

方法3

因为上面两个方案都没解决我的问题,我尝试了这个方法:直接更新libstdc++

然后还真就成了。。。

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get upgrade libstdc++6

更新之后,系统的libstdc++.so.6指向了一个更新的libstdc++.so.6.0.32,旧的libstdc++.so.6.0.28被替换。问题解决。