CentOS卸载Intel HPC工具包后g++/gcc找不到libsvml.so报错如何解决
解决方案
一、查询g++当前查找的依赖库列表
- 编译阶段库路径查询:执行
g++ -print-search-dirs,输出结果中libraries:项后列出的就是g++链接阶段搜索的所有库路径,可直接检查是否包含英特尔相关目录。 - 编译后二进制依赖查询:编译得到可执行文件后,执行
ldd 你的可执行文件名,即可列出程序运行时需要加载的所有共享库,缺失的库会显示not found。 - 系统全局共享库配置查询:执行
ldconfig -p可查看当前系统缓存的所有共享库列表,也可直接查看/etc/ld.so.conf文件和/etc/ld.so.conf.d/目录下的所有配置文件,检查是否添加了英特尔库路径。 - 会话级动态库路径查询:执行
echo $LD_LIBRARY_PATH,即可查看当前shell会话中优先加载的动态库搜索路径,检查是否有残留的英特尔工具包路径。
二、清除g++对英特尔数学库的搜索逻辑
该问题核心原因是卸载英特尔HPC工具包时,未清理其安装时写入的环境变量或全局ld配置,导致所有版本gcc/g++都会额外搜索已删除的英特尔库路径,按以下步骤清理即可:
- 清理环境变量残留
检查以下配置文件:- 当前用户配置:
~/.bashrc、~/.bash_profile、~/.zshrc(若使用zsh) - 全局配置:
/etc/profile、/etc/profile.d/目录下所有.sh后缀的文件
删除其中所有和英特尔工具包相关的配置行,比如source /opt/intel/xxx/setvars.sh、手动export LD_LIBRARY_PATH添加英特尔路径的行,修改完成后执行source ~/.bashrc(对应你修改的配置文件),或注销重登用户生效。
注意:scl安装的devtoolset、系统自带gcc本身不会绑定英特尔库路径,若这两个版本也报错,基本可确定是环境变量残留导致
- 当前用户配置:
- 清理全局ld配置残留
检查/etc/ld.so.conf.d/目录下是否存在英特尔相关的配置文件(比如intel-hpc.conf、intel-oneapi.conf等),删除这类文件后执行ldconfig刷新系统共享库缓存即可。 - 自编译gcc特殊处理
若清理完上述配置后,自行编译的gcc 10.1.0仍报缺失英特尔库的错误,说明编译该版本gcc时硬编码了英特尔库的rpath路径,重新编译gcc,编译过程中不要添加任何英特尔相关的链接、优化参数即可解决。 - 临时验证方法
无需修改配置即可验证问题原因:执行unset LD_LIBRARY_PATH后再编译运行测试代码,若不再报错,可确认是环境变量残留导致,按上述步骤清理即可。
内容的提问来源于stack exchange,提问作者Runfeng Jin
相关产品推荐
相关产品推荐

