加载链接到R中的Rust库的共享库

在这里继续讨论这个问题,我遇到了使用dyn.load加载链接到Rust dylib的共享库的问题。 我怀疑它与R在寻找Rust dylib的地方有关,但我还没有找到一种方法来指定另一个位置,而不管默认设置是什么。

从R,我执行以下操作:

> dyn.load('src/test.so')

并收到此错误消息:

Error in dyn.load("src/test.so") : 
  unable to load shared object '/Users/Zelazny7/r-dev/rustr/src/test.so':
  dlopen(/Users/Zelazny7/r-dev/rustr/src/test.so, 6): Library not loaded: libglue.dylib
  Referenced from: /Users/Zelazny7/r-dev/rustr/src/test.so
  Reason: image not found

如何加载依赖于另一个共享库的共享库?

dyn.load的文档没有指定如何执行此操作。

更新:

感谢shepmaster,我能够在R中成功构建和导入共享库。共享库已用C编译,并且本身链接到Rust库。 这些是我的步骤:

  • 编译共享的Rust库
  • 使用以下命令编译共享的C库和链接到Rust库(在Windows中,因为我在今天上午工作)
  • 我的目录内容:

    C:Usersgraveseetest>ls
    rglue.dll  rglue.rs  rustr.c  treble.h
    

    编译最终的共享库:

    gcc -shared -m64 -I"C:Program FilesRR-3.2.0include" rustr.c -L"C:Program FilesRR-3.2.0binx64" -lR -L. -lrglue -o test.dll
    

    在R中加载库:

    > dyn.load("test.dll")
    > is.loaded("triple")
    [1] TRUE
    > .Call("triple", as.integer(32))
    The triple is 96
    

    问题在于你的共享库不在你的系统默认的目录中。

    有几个技巧可以使用,其中2个我能够完成工作:

  • 从编译库的相同目录运行R.

  • 在启动R之前设置LD_LIBRARY_PATH (Linux)或DYLD_LIBRARY_PATH (OS X)。

    DYLD_LIBRARY_PATH=/path/to/rust/lib/ R
    
  • 在构建共享库时,您应该能够设置rpath。

    g++ -shared treble.cxx -o treble.so -L/tmp/ -Wl,-rpath,/tmp -lglue
    

    但是,我无法在OS X上很好地工作,所以我不确定我在做什么错误。

  • (仅适用于OS X)构建C ++库后,可以更改引用原始Rust库的安装名称并包含绝对路径:

    install_name_tool -change libglue.dylib /tmp/libglue.dylib treble.so
    
  • 基本上,当您的默认链接程序搜索路径中不存在多个这样的库时,您将需要查找如何拥有依赖于其他共享库的共享库。

    来源

    在Mac OS X中链接动态库(libjvm.dylib)(rpath问题)

    在OSX上打印可执行文件的路径

    @executable_path,@load_path和@rpath

    如何在构建时修改.dylib的安装名称

    铿锵声,在链接时更改相关的共享库安装名称


    虽然最初的答案很好,但我在这里提出了一个替代方法。

    链接地址: http://www.djcxy.com/p/85843.html

    上一篇: Load a shared library linked to Rust library in R

    下一篇: SSL Exception when using Volley