我正在尝试在Linux机器上安装一些软件(python的rpy2软件包,特别是rpy2.robjects,如果重要的话)。我需要软件在我的本地空间中查找它的共享库,而不是像/ usr / lib64这样的全局空间。我没有这台机器的管理员权限。我的问题是,即使我将LD_LIBRARY_PATH设置为指向我的本地空间,软件仍会转到/ usr / lib64 / whatever,它会找到过时的库。这些库缺少它需要的一些对象,因此失败了。什么可以优先于LD_LIBRARY_PATH,有没有办法改变/摆脱它?感谢。
BTW,这个网站上的某个人在一年或更久以前遇到过类似的问题,但他的答案涉及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”,正如我想的那样。
好吧,我猜这是进步。有人还有别的吗?感谢。
答案 0 :(得分:4)
查看名为$ 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"
答案 1 :(得分:1)
如果有人还在阅读本文,我会参与一些“人事工程”来解决问题,即让系统管理员重新安装R,以便它拥有我需要的一切。他们当然很好。非常感谢所有提出建议的人。我想继续其中一些,但我必须忙于这个项目。很有责任!
答案 2 :(得分:0)
RPATH
仅在编译时有用(好吧,链接);它会影响到二进制文件中的库搜索路径。
尝试使用LD_DEBUG=libs
运行,这将显示正在从哪些路径加载库。它是否尝试从您的LD_LIBRARY_PATH
加载但是失败,或者首先不在那里搜索(也许rpy2
有自己的库路径机制?)或其他什么?
答案 3 :(得分:0)
尝试添加LD_LIBRARY_PATH左侧的目录,因为优先级从左到右。
export LD_LIBRARY_PATH=~/your/custom/path:$LD_LIBRARY_PATH