写在前面
目前在学习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
被替换。问题解决。