3

我正在尝试在 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”,就像我想的那样。

好吧,我猜这就是进步。有人还有什么吗?谢谢。

4

4 回答 4

4

查看一个名为 $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"
于 2012-07-25T23:51:54.340 回答
1

If anyone is still reading this, I engaged in some "personnel engineering" to solve the problem, i.e. got the system admins to re-install R so that it had everything I needed. Was certainly nice of them. Thanks very much to everyone who gave suggestions. Would like to keep going on some of them, but I've got to get busy on this project. Much obliged!

于 2012-07-31T15:46:29.917 回答
0

RPATH仅在编译时有用(嗯,链接);它会影响烘焙到二进制文件中的库搜索路径。

尝试使用 运行LD_DEBUG=libs,这将显示正在从哪些路径加载库。它是试图从您的加载LD_LIBRARY_PATH但失败,还是首先不在那里搜索(也许rpy2有自己的库路径机制?),还是其他什么?

于 2012-07-25T21:26:08.080 回答
0

尝试将您的目录添加到 LD_LIBRARY_PATH 的左侧,因为优先级从左到右。

export LD_LIBRARY_PATH=~/your/custom/path:$LD_LIBRARY_PATH
于 2012-07-25T21:36:28.217 回答