我正在尝试在 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)。正是这个文件中的命令在 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"
关于python - LD_LIBRARY_PATH 优先级和编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658687/