在使用Python编写或运行时,有时会遇到类似于ImportError: libstdc++.so.6: version GLIBCXX_3.4.29’ not found`的错误。这个错误通常与系统缺少某个特定的库文件相关。
在这里插入图片描述

问题原因

libstdc++.so.6是GNU C标准库的共享对象文件。它包含了许多C的标准函数和类实现,供C程序使用。当我们导入需要依赖C库的Python模块时,Python解释器会尝试动态链接到系统中的libstdc++.so.6库文件。

然而,如果系统中没有找到libstdc++.so.6文件,或者找到的版本不符合Python模块的要求(如缺少GLIBCXX_3.4.29版本),就会导致ImportError错误。

解决方法

方法1:安装/更新 libstdc++6 库

最简单的解决方法是安装正确版本的C++库。我们可以使用系统的包管理器(如apt、yum、brew等)来安装相应的库文件。

例如,在Ubuntu上,我们可以使用以下命令安装C++标准库:

sudo apt update
sudo apt install libstdc++6

这个命令会安装libstdc++.so.6文件,并确保它的版本符合Python模块的要求。

但是在我的环境上,执行上述命令后还是不起作用。这时,可以尝试方法2。

方法2:拷贝+软链接方式

当前程序运行的ENV环境查看GLIBCXX版本

在 Anaconda3 中打开我们当前程序所使用的虚拟环境,如 test_3_10。

source activate test_3_10

进入虚拟环境的lib目录,查看当前虚拟环境中 GLIBCXX 的版本。

cd /data/anaconda3/envs/test_3_10/lib
strings libstdc++.so.6 | grep GLIBCXX

[截图]

可以看到不存在我们所需要的文件 GLIBCXX_3.4.29,所以导致了我们前面的报错。

全局查看是否存在高版本的GLIBCXX

先全局查看系统下同类型文件,存在的高版本文件

find / -name "libstdc++.so.6*"

只要出现了大于等于所需版本的文件,任意选择一个即可,如:

在这里插入图片描述

可以看到目录 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 下存在高版本的GLIBCXX文件,正是我们所需要的。

/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30

目录/usr/lib/x86_64-linux-gnu 下再次查看并确认GLIBCXX版本

接着,我们可以在 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 目录下查找 GLIBCXX:

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

输出如下:
在这里插入图片描述
可以看到 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 下存在高版本的GLIBCXX文件(GLIBCXX_3.4.29、GLIBCXX_3.4.30)。

这时,我们只需要将文件拷贝到我们使用的虚拟环境 test_3_10 中,并建立软链接即可。具体命令如下:

# 拷贝文件
cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 /data/anaconda3/envs/test_3_10/lib


# 删除原链接
rm /data/anaconda3/envs/test_3_10/lib/libstdc++.so.6

# 建立新的连接
ln -s /data/anaconda3/envs/test_3_10/lib/libstdc++.so.6.0.30 /data/anaconda3/envs/test_3_10/lib/libstdc++.so.6

配置好后,再次进入虚拟环境的lib目录,查看当前虚拟环境 test_3_10 中 GLIBCXX 的版本。

cd /home/xxx/anaconda3/envs/test_3_10/lib
strings libstdc++.so.6 | grep GLIBCXX

输出如下:
在这里插入图片描述
可以看到,已经成功地将 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 目录的GLIBCXX文件拷贝至我们程序运行的虚拟环境 test_3_10 中。

大功告成!

参考博客

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐