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

时间:2015-06-18 02:57:03

标签: r shared-libraries rust

关注此问题here,我在使用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的{​​{3}}未指定如何执行此操作。

更新

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

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

    C:\Users\gravesee\test>ls
    rglue.dll  rglue.rs  rustr.c  treble.h
    

    编译最终的共享库:

    gcc -shared -m64 -I"C:\Program Files\R\R-3.2.0\include" rustr.c -L"C:\Program Files\R\R-3.2.0\bin\x64" -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 个答案:

答案 0 :(得分:4)

问题可归结为这样一个事实,即你的共享库不在你的系统默认的目录中。

你可以使用一些技巧,其中2个我能够工作:

  1. 从编译库的同一目录运行R.

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

    DYLD_LIBRARY_PATH=/path/to/rust/lib/ R
    
  3. g++ -shared treble.cxx -o treble.so -L/tmp/ -Wl,-rpath,/tmp -lglue
    

    但是,我无法在OS X上很好地使用它,所以我不确定我做错了什么。

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

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

    <强>来源

    iterator range constructor

    Linking a dynamic library (libjvm.dylib) in Mac OS X (rpath issue)

    Print rpath of executable on OSX

    @executable_path, @load_path and @rpath

    How do I modify the install name of a .dylib at build time

答案 1 :(得分:0)

虽然最初的答案很好,但我为此here提出了另一种方法。