【问题标题】:Setting LD_LIBRARY_PATH from inside R从 R 内部设置 LD_LIBRARY_PATH
【发布时间】:2017-01-05 20:58:26
【问题描述】:

我已经安装了一个 R 包,但是为了通过 library 加载它,需要将 LD_LIBRARY_PATH 设置为其中一个名为 libhts.so.2 的库所在的路径。只有在进入 R 之前编辑 LD_LIBRARY_PATH 时加载才有效,不是之后

我尝试了几种不同的方法来解决这个问题:

  1. 从位于 R 包中的 configure 脚本中导出修改后的 LD_LIBRARY_PATH。
  2. 在同一 configure 脚本中创建指向共享库的软链接。

两者都没有工作,在我看来,一旦 R 启动,就有一个变量存储 LD_LIBRARY_PATH 的结果。也许解决方案是编辑该变量。

【问题讨论】:

  • R 内部调用Sys.setenv(LD_LIBRARY_PATH="/path/to/blah") 将改变任何未来子进程的环境,但不会改变R 本身的环境(可以通过ps e 看到)。不过,this post 似乎表明它有所作为,所以你可以试一试。
  • .. 或者Sys.setenv(LD_LIBRARY_PATH=paste("/path/to/blah", Sys.getenv("LD_LIBRARY_PATH"),sep=":")) ,以免破坏现有路径
  • 设置环境变量有效!但是,库的加载不起作用...
  • 编写 R 扩展的guide 说:在 Unix 上,用于解析动态链接的依赖库的路径在进程启动时是固定的(出于安全原因)(... )。恐怕这意味着您的问题无法解决:任何解决方案都将被视为安全风险......
  • 我一定会读到的,但是我尝试了 dyn.load(path_to_library) 并且成功了!在您看来,您对此有何看法?会不会有安全风险?

标签: r unix linker-flags


【解决方案1】:

Hans Lub 的帮助下,解决问题的方法是使用 dyn.load() 函数并提供库的完整路径:

dyn.load('path_to_library')

然后,通过library 加载应该可以工作。

【讨论】:

  • 是的,这是可行的,但是如果你想安装一个新的包,安装发生在一个全新的环境中,并且在安装尝试加载 DLL 之前没有机会使用 dyn.load()。
  • 例如:如果我在 $HOME 下的某个地方安装了引用 libjvm.so 的 rJava(因为我没有 root 权限),那么我必须使用 dyn.load("/home/... ../libjvm.so") 在加载 rJava 之前。没问题。但是当我尝试安装 RJDBC 时,安装脚本会尝试加载 rJava 并落入堆中。
  • @MichaelHenry 在这种情况下,您可以使用withr::with_makevars,将-L/path/to/library 添加到PKG_LIBS 变量中。见stackoverflow.com/a/45178482/570918
  • 如果您可以编辑$prefix/lib/R/etc/ldpaths - 例如当使用用户空间编译器从源代码构建 R 时,一切就绪。我认为从源代码构建的安装过程(R)有点损坏,因为它没有从构建环境更新加载路径引导程序。但是,幸运的是,编辑etc/ldpaths 内容以注入路径对我有用。有没有更优雅的方式?
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多