【问题标题】:LD_LIBRARY_PATH precendence and trouble with compilingLD_LIBRARY_PATH 优先级和编译问题
【发布时间】:2012-07-24 09:55:12
【问题描述】:

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

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

【问题讨论】:

    标签: python linux r rpy2 installation


    【解决方案1】:

    如果有人还在读这篇文章,我参与了一些“人事工程”来解决这个问题,即让系统管理员重新安装 R,以便它拥有我需要的一切。他们当然很好。非常感谢所有提出建议的人。想继续其中一些,但我必须忙于这个项目。非常感谢!

    【讨论】:

      【解决方案2】:

      查看一个名为 $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"
      

      【讨论】:

      • 不得不离开办公桌几天,所以现在不能尝试其他任何事情。但是感谢大家的帮助!
      • flodel,如果您或任何人仍在阅读此处,我尝试设置 R_LD_LIBRARY_PATH。它似乎在设置 LD_LIBRARY_PATH 时起作用,但是当我尝试通过 rpy2 到达 R 时得到的行为仍然与上面相同。 python/rpy2 只是不会转向旧库。任何其他想法都是最受欢迎的。顺便说一句,要查看“LD_LIBRARY_PATH”的值,我必须使用 os.getenv(),而不是 Sys.getenv()。我做错了吗?
      【解决方案3】:

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

      export LD_LIBRARY_PATH=~/your/custom/path:$LD_LIBRARY_PATH
      

      【讨论】:

      • 非常感谢,但我仍然遇到同样的问题。
      【解决方案4】:

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

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

      【讨论】:

      • 不,不,RPATH 在运行时也很有用。
      • @VladLazarenko 怎么样? man ld.so 记录了它的运行时库搜索路径,即:二进制中的DT_RPATH,环境中的LD_LIBRARY_PATH,二进制中的DT_RUNPATHld.so.cache(通常基于ld.so.conf 构建),以及在标准库位置。 RPATH在环境中没有使用。
      • 好的,我试过 LD_DEBUG。一个我不知道的非常有用的工具。这是输出的 sn-p:
      • 好的,如果您不介意,我会将输出放入我的问题的编辑中。作为评论无法阅读。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多