我试图在Linux机器上安装一些软件(python的rpy2包,特别是rpy2.robjects,如果重要的话).我需要软件在我的本地空间中查找它的共享库,而不是像/usr/lib64这样的全局空间.我没有这台机器的管理员权限.我的问题是,即使我将LD_LIBRARY_PATH设置为指向我的本地空间,软件仍会转到/usr/lib64 / whatever,它会找到过时的库.这些库缺少它需要的一些对象,因此失败了.什么可以优先于LD_LIBRARY_PATH,有没有办法改变/摆脱它?谢谢.
顺便说一下,这个网站上的某个人在一年或更久以前有类似的问题,但他的答案涉及env变量RPATH,并使用chrpath实用程序更改它.我根本不清楚rpy2是否使用RPATH,并且chrpath似乎在我的系统上不可用.
附录:我尝试使用LD_DEBUG = libs运行.有很多输出,看起来系统正在我的LD_LIBRARY_PATH中寻找lib并找到它们.这是麻烦似乎开始的地方:
/usr/local/lib64/R/library/methods/libs/methods.so: error: symbol lookup error:
undefined symbol: Rf_allocS4Object (fatal)
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/local/lib64/R/library/methods/libs/methods.so':
/usr/local/lib64/R/library/methods/libs/methods.so: undefined symbol: Rf_allocS4Object
所以我的猜测是,问题是DLLpath中的任何内容都会覆盖LD_LIBRARY_PATH.我试图通过将我的目录添加到os.environ [‘PATH’]来改变这种情况,但是没有.显然没有“DLLPATH”,因为我认为会有.
好吧,我猜这是进步.有人还有别的吗?谢谢.
解决方法:
看一下名为$R_HOME / etc / ldpaths的文件(在你的情况下,$R_HOME似乎是/usr/local/lib64 / R).这个文件中的命令在R的启动时设置LD_LIBRARY_PATH.
我看起来像这样:
flodel@netbook-samsung-N150:~$cat /usr/lib/R/etc/ldpaths
: ${JAVA_HOME=/usr/lib/jvm/java-6-openjdk/jre}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/i386/client:${JAVA_HOME}/lib/i386:/usr/lib/jni}
if test -n ""; then
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:}
else
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}
fi
if test -n "${R_JAVA_LD_LIBRARY_PATH}"; then
R_LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${R_JAVA_LD_LIBRARY_PATH}"
fi
if test -z "${LD_LIBRARY_PATH}"; then
LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}"
else
LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}"
fi
export LD_LIBRARY_PATH
如果您没有该文件的写入权限,您仍然可以在启动R之前执行此操作:
export R_LD_LIBRARY_PATH=/your/custom/path
我在我的机器上测试了它在R启动后通过运行以下命令来工作:
Sys.getenv("LD_LIBRARY_PATH")
#[1] "/your/custom/path:/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:/usr/lib/jvm/java-6-openjdk/jre/lib/i386:/usr/lib/jni"