如何在不修改默认版本的情况下配置环境使指定软件使用旧版gcc/g++,解决CXXABI_1.3.8缺失及依赖库找不到问题
如何在不修改默认版本的情况下配置环境使指定软件使用旧版gcc/g++,解决CXXABI_1.3.8缺失及依赖库找不到问题
看起来你遇到的是典型的旧版软件在新Ubuntu系统上的库兼容问题,不用慌,咱们完全不用改动系统默认的gcc版本,只需要给目标软件单独配置环境就能解决,下面一步步来操作:
一、先理清核心问题
你当前的问题有两个:
- 系统默认的
libstdc++.so.6版本太高,缺少软件需要的CXXABI_1.3.8符号 - 软件自身的大量依赖库(比如
libvsacpp.so、libQtCore.so.4等)找不到,说明这些库可能在软件的安装目录里,但系统没去那里找
之前你设置LD_LIBRARY_PATH只加了gcc44的库目录,没包含软件自身的库目录,而且顺序也不对,导致动态链接器还是优先用系统的库,所以没生效。
二、正确配置LD_LIBRARY_PATH(针对csh/tcsh)
咱们把软件的库目录放在最前面,让动态链接器优先加载软件自带的库,而不是系统的:
# 先替换成你的软件实际安装路径 setenv SOFTWAREHOME "/software" # 把软件自带的gcc库目录和自身库目录都加到最前面,保留原系统路径 setenv LD_LIBRARY_PATH "$SOFTWAREHOME/lib/linux_gcc44x_64:$SOFTWAREHOME/lib:$LD_LIBRARY_PATH"
验证配置是否生效
- 先确认路径已经正确添加:
输出应该能看到你加的两个目录在最前面。echo $LD_LIBRARY_PATH - 再用
ldd检查软件的库依赖:
看看ldd /path/to/your/application # 替换成软件的实际可执行文件路径libstdc++.so.6是不是指向/software/lib/linux_gcc44x_64里的版本,那些之前显示not found的库现在能不能找到。
三、设置专属启动脚本(避免每次手动配置)
如果不想每次启动软件都手动输命令,可以写一个专属的启动脚本:
- 创建一个
start_myapp.csh文件,内容如下:#!/bin/csh # 替换成你的软件安装路径 setenv SOFTWAREHOME "/software" # 配置库路径 setenv LD_LIBRARY_PATH "$SOFTWAREHOME/lib/linux_gcc44x_64:$SOFTWAREHOME/lib:$LD_LIBRARY_PATH" # 替换成软件的实际启动命令 exec "$SOFTWAREHOME/bin/your_application" - 给脚本加执行权限:
chmod +x start_myapp.csh - 以后直接运行这个脚本就能启动软件,自动加载正确的库了。
四、备选方案:用patchelf修改软件的rpath(更彻底)
如果上面的方法还是不行,或者不想依赖环境变量,可以用patchelf工具直接修改软件可执行文件的rpath(运行时库搜索路径):
- 先安装patchelf:
sudo apt install patchelf - 修改软件的rpath,让它直接指向自带的库目录:
这样即使不设置patchelf --set-rpath '/software/lib/linux_gcc44x_64:/software/lib' /path/to/your/applicationLD_LIBRARY_PATH,软件启动时也会自动去指定的目录找库,完全不会影响系统其他程序。
五、额外验证步骤
确认软件自带的libstdc++.so.6确实包含需要的CXXABI_1.3.8:
strings /software/lib/linux_gcc44x_64/libstdc++.so.6 | grep CXXABI_1.3.8
如果输出里有CXXABI_1.3.8,说明这个库是对的;如果没有,可能软件安装包不全,需要重新检查安装文件。
备注:内容来源于stack exchange,提问作者onepound
相关产品推荐
相关产品推荐

