写在前面
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。
看到这里先别急着升级gcc
和g++
,因为系统可能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
被替换。问题解决。