REF:
- https://github.com/pybind/pybind11/discussions/3453
- https://blog.csdn.net/baidu_20457783/article/details/134482265
报错实例
ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/xxx/anaconda3/envs/habitat/lib/python3.9/site-packages/kiwisolver/_cext.cpython-39-x86_64-linux-gnu.so)
-
[Step 0]:
libstdc++
和GLIBCXX_3.x.x
的关系libstdc++
是 GNU C++ 标准库的一个实现,允许程序使用 C++ 标准库中定义的各种功能。GLIBCXX_3.x.x
是libstdc++
版本号的一部分,用于标示库中某个特定的版本或功能集。- 在 Linux 系统上编译 C++ 程序时,编译器(如 g++)会将程序与
libstdc++
链接。此过程中,程序会依赖特定版本的GLIBCXX
来确保所有使用的库特性都是兼容的。 - 即一个 libstdc++ 库会支持多个 GLIBCXX_3.x.x 版本 , 每个标记代表库中某个特定版本的功能。
- 所以上面报错的原因就是
/lib/x86_64-linux-gnu/libstdc++.so.6
中不包含GLIBCXX_3.4.29
版本。所以我们要做的就是更新 对应的C++版本。
- [Step 1]: 查看当前系统版本支持的
GLIBCXX
.
输出就是当前strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX # /usr/lib/libstdc++.so.6
libstdc++
包含的版本,可以看到并不包含GLIBCXX_3.4.29
GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBCXX_3.4.15 GLIBCXX_3.4.16 GLIBCXX_3.4.17 GLIBCXX_3.4.18 GLIBCXX_3.4.19 GLIBCXX_3.4.20 GLIBCXX_3.4.21 GLIBCXX_3.4.22 GLIBCXX_3.4.23 GLIBCXX_3.4.24 GLIBCXX_3.4.25 GLIBCXX_3.4.26 GLIBCXX_3.4.27 GLIBCXX_3.4.28 GLIBCXX_DEBUG_MESSAGE_LENGTH
- [Step 2]: 查找对应支持
GLIBCXX
版本的libstdc++
版本,并复制到对应的文件中。-
查找对应版本
- https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
GCC 11.1.0: GLIBCXX_3.4.29, CXXABI_1.3.13
-->GCC 11.1.0: libstdc++.so.6.0.29
-
因此,我们需要找到
libstdc++.so.6.0.29
放到/lib/x86_64-linux-gnu/
下,并修改libstdc++.so.6
的连接。- [option 1] 查找当前系统中有没有
libstdc++.so.6.0.29
文件。一般conda 和 pip 在安装库的时候,都会下载各种版本的
libstdc++
,如果有,就不用再下载了,直接cp
过来就行。
## -- 查找 `libstdc++.so.6.0.29` -- ## find / -name libstdc++.so.6.0.29 # 可以 root 搜 ## -- 将对应的文件 cp 到 /lib/x86_64-linux-gnu/,并更改连接 -- ## cp /home/wubing/anaconda3/lib/libstdc++.so.6.0.29 /lib/x86_64-linux-gnu/ # root rm -f libstdc++.so.6 # 删除旧的链接文件 ln -s libstdc++.so.6.0.29 libstdc++.so.6 # 创建新的链接 $ ll -h | grep libstd lrwxrwxrwx 1 root root 19 5月 9 14:58 libstdc++.so.6 -> libstdc++.so.6.0.29* -rw-r--r-- 1 root root 1.9M 7月 9 2023 libstdc++.so.6.0.28 -rwxr-xr-x 1 root root 18M 5月 9 14:55 libstdc++.so.6.0.29*
- [option 2] 下载对应版本的
libstdc++
- [option 1] 查找当前系统中有没有
-
- [Step 4]: 重复第二步,检测当前支持的
GLIBCXX
版本