我正在尝试在Linux机器上安装一些软件(python的rpy2包,特别是rpy2.robjects,如果重要的话)。我需要该软件在我的本地空间中查找其共享库,而不是在 /usr/lib64 等全局空间中查找。我没有这台机器的管理员权限。我的问题是,即使我将 LD_LIBRARY_PATH 设置为指向我的本地空间,该软件仍然会转到 /usr/lib64/whatever,在那里它会找到过期的库。这些库缺少它需要的一些对象,因此失败。什么可能优先于 LD_LIBRARY_PATH,有没有办法更改/删除它?谢谢。
顺便说一句,该网站上的某人一年或更长时间前有过类似的问题,但他的答案涉及环境变量 RPATH,并使用 chrpath 实用程序更改它。我根本不清楚 rpy2 正在使用 RPATH,并且 chrpath 在我的系统上似乎不可用。
附录:我尝试使用 LD_DEBUG=libs 运行。得到大量输出,看起来系统正在我的 LD_LIBRARY_PATH 中查找库并找到它们。麻烦似乎就是从这里开始的:
/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)。这是该文件中的命令设置LD_LIBRARY_PATH
在 R 的启动阶段。
我的看起来像这样:
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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)