Bootstrap

ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

偶然遇到了这个问题,经检索,常见的原因是两个,(1)gcc、gxx 版本太低,GLIBCXX_3.4.29依赖于gcc、gxx的大于等于11;(2)libstdc++.so.6太旧,需要升级。下面将详细介绍这两种方法。

本人亲测方法一,方法二仅整理记录。

如果是pandas导致的错误,可参考最后面放的github链接。

一、gcc、gxx版本太低

概述:当前在Conda环境下使用的GCC/G++版本是7.5,而需要GLIBCXX_3.4.29(即GCC 11或更高版本)来满足faiss库的依赖要求,可以通过Conda来更新GCC/G++。Conda允许在特定环境中安装不同版本的编译器,这样可以避免干扰系统级别的编译器版本。

1. 激活conda环境(如果不在conda中,则跳过)

注意,your_env为你自己的虚拟环境

conda activate your_env

2. 搜索可用的GCC包

先搜索Conda上可用的GCC版本,这有助于确认GCC 11是否可用。

conda search gcc

输出如下:

注:如果搜索到的gcc版本仍较低,可能要升级下conda

3. 安装gcc11 & gxx 11

在第2步中可以查询到可用的版本,比如,11.1.0

默认路径下的libstdc++.so.6缺少GLIBCXX_3.4.29

4. 验证安装

安装完成后,可以通过运行gcc --versiong++ --version来验证新安装的GCC版本。请确保这些命令是在Conda环境中运行的,以确保它们反映的是Conda环境中的编译器版本,而不是系统级别的版本。

gcc --version
g++ --version

5. 配置LD_LIBRARY_PATH环境变量

名词解释:LD_LIBRARY_PATH是一个环境变量,在Linux和类Unix操作系统中,它定义了动态链接器搜索共享库时的路径列表。当运行一个程序时,动态链接器会查找程序依赖的共享库(例如.so文件),LD_LIBRARY_PATH就是告诉链接器除了标准路径外,还可以在哪些额外的路径中查找这些共享库。

首先,查看当前的LD_LIBRARY_PATH:

echo $LD_LIBRARY_PATH

然后,设置LD_LIBRARY_PATH(短暂生效,当前终端):

注意:其中的environment_name和conda_installation_path需要更换为自己的。

export LD_LIBRARY_PATH=<conda_installation_path>/envs/<environment_name>/lib:$LD_LIBRARY_PATH

注意事项

  • 临时设置:上述export命令只会临时设置LD_LIBRARY_PATH,仅对当前终端会话有效。关闭终端或开启新的会话将不再保留这个设置。
  • 永久设置:如果你希望每次激活Conda环境时都自动设置LD_LIBRARY_PATH,你可以将上述export命令添加到你的环境激活脚本中,通常是环境目录下的bin/activate文件。
  • 安全性:不建议在全局环境变量中设置LD_LIBRARY_PATH,因为这可能会引起安全问题和版本冲突。最好是在需要时临时设置,或者仅在特定环境中设置。

二、libstdc++.so.6太旧

原因:默认路径下的libstdc++.so.6缺少GLIBCXX_3.4.29

1. 使用指令先看下系统目前都有哪些版本的

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

输出如下:

只到3.25,所以确定是缺少GLIBCXX_3.4.29。

2. 查找更高版本的libstdc++.so.6

查询更高版本的libstdc++.so.6,期望找到 libstdc++.so.6.0.29

快速查询:

ls /usr/lib/x86_64-linux-gnu/libstdc++.so.6*

全局查询:

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

(1)如果可以找到,记录libstdc++.so.6.0.29的路径:

strings /home/wuye/anaconda3/envs/tf2/lib/libstdc++.so.6.0.29 | grep GLIBCXX

输出如下:

可以看到有需要的版本,接下来就是建立新的链接到这个文件上。

# 复制
sudo cp /home/wuye/anaconda3/envs/tf2/lib/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/
# 删除之前链接
sudo rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6
# 创建新的链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

(2)如果不能找到,离线下载libstdc++.so.6.0.29

可在网上检索云盘,或者其他网址下载libstdc++.so.6.0.29,然后执行上面的复制,删除链接,创建链接

https://pkgs.org/download/libstdc++.so.6

如果是ubuntu系统,可采用下面的命令进行升级。

sudo apt update
sudo apt install libstdc++6

参考:

libstdc++.so.6: version `GLIBCXX_3.4.29' not found · pybind/pybind11 · Discussion #3453 · GitHub

如何解决version `GLIBCXX_3.4.29‘ not found的问题_glibcxx not found-CSDN博客

;