偶然遇到了这个问题,经检索,常见的原因是两个,(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 --version
和g++ --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博客