问题描述
我从别的服务器打包了conda虚拟环境迁移到另一台服务器,运行程序的时候出错,显示/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.30’ not found(required by....)。我在原服务器中是没有出现这个问题的。
原因分析:
排查下来发现是系统库没有对应版本GLIBCXX,conda虚拟环境中有对应版本,程序调用的是系统库所以出错了。
这里程序调用的是系统里面的lib,使用这个命令查看系统是否有对应版本的GLIBCXX,显示版本最多到3.4.29。
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
然后我查看了conda环境中的lib,可以看到是有对应版本的GLIBCXX,所以需要让程序优先调用 conda 环境中的lib目录(而非系统默认库),指定库的加载路径。


这里我直接查看libstdc++.so.6.0.34而不是libstdc++.so.6.
豆包的解释
在 conda 虚拟环境的lib文件夹中,libstdc++.so.6和libstdc++.so.6.0.34是 C++ 标准库的相关文件,它们的主要区别如下:
①文件类型与关系
libstdc++.so.6.0.34是实际的库文件,6.0.34是具体版本号,代表该库的完整版本
libstdc++.so.6是一个符号链接(软链接),通常指向当前环境中正在使用的libstdc++库版本(在你的情况中就是指向libstdc++.so.6.0.34)
②作用不同
程序编译和运行时,通常会查找libstdc++.so.6这个通用名称
符号链接的存在是为了兼容不同版本:当库版本更新(比如到6.0.35)时,只需将libstdc++.so.6重新指向新的版本文件,而不需要修改依赖它的程序
③版本兼容性
libstdc++.so.6.0.34包含该版本库的具体实现,支持特定的GLIBCXX版本(比如可能包含GLIBCXX_3.4.30)
不同的6.0.x版本会支持不同的GLIBCXX特性,版本越高通常支持的GLIBCXX版本也越高
解决方案:
- 方法 1:临时设置 LD_LIBRARY_PATH 环境变量
LD_LIBRARY_PATH是Linux系统用于指定动态链接库(.so文件)加载路径的环境变量,优先级高于系统默认路径。这种方法仅对当前终端会话有效,关闭终端后失效。
# 激活你的conda环境
conda activate 你的环境名
# 设置环境变量,指向当前conda环境的lib目录
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
- 方法 2:通过 conda 配置自动设置
利用conda的env_vars功能,让环境激活时自动设置LD_LIBRARY_PATH:
进入 conda 环境的配置目录,创建激活环境时的脚本。
touch $CONDA_PREFIX/etc/conda/activate.d/set_libpath.sh
在set_libpath.sh脚本中设置变量。
export LD_LIBRARY_PATH_OLD=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
创建退出环境时的脚本并恢复变量。
touch $CONDA_PREFIX/etc/conda/deactivate.d/unset_libpath.sh
在unset_libpath.sh脚本中输入这两行内容。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH_OLD
unset LD_LIBRARY_PATH_OLD
验证一下,首先输出的是conda虚拟环境中的lib,设置成功。

总结:
感谢豆包!
参考链接:
conda环境中 解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.30’
1718

被折叠的 条评论
为什么被折叠?



