2016-05-04 70 views
2

我试图解决外部库加载Rust的问题。在OS X上的锈和加载程序路径(@rpath,@loader_path)

输入:

我有一个可执行rtest和dylib libcpp2rs.dylib。该库通过FFI链接到可执行文件:

#[link(name="cpp2rs")] 
extern { ... } 

build.rs文件(我传递一个额外的参数与libcpp2rs.dylib位置):

pub fn main() { 
    println!("cargo:rustc-link-search=native=./cpplib/bin"); 
} 

而且我Cargo.toml文件:

[package] 
name = "rtest" 
version = "0.1.0" 
authors = ["astavonin"] 
build = "build.rs" 
rpath = true 
[dependencies] 
libc = "0.2.10" 

而我使用cargo build命令进行编译。

输出:

otool让我发现,库将被RPATH加载:

> otool -L rtest 
rtest: 
@rpath/libcpp2rs.dylib (compatibility version 0.0.0, current version 0.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 

但同时也可执行无LC_LPATH部分:

> otool -l rtest | grep LC_RPATH 
> 

它导致我的应用程序出现加载错误:

> ./rtest 
dyld: Library not loaded: @rpath/libcpp2rs.dylib 
    Referenced from: /Users/astavonin/projects/Tests/rtest/target/debug/./rtest 
    Reason: image not found 
zsh: trace trap ./rtest 

此问题可以通过install_name_tool的用法修复,但我更喜欢在编译过程中不引入其他步骤。

  1. 是否有可能(以及如何)从@rpath改变负载类型与cargo配置,@loader_path /构建脚本?
  2. 是否可以将@rpath值传递给cargo
+0

请编辑您的问题以包括libcpp2rs.dylib位于何处,您如何通知Rust它在哪里以及如何构建代码。 – Shepmaster

回答

2

周围的一些研究后,我发现,实际的问题是libcpp2rs.dylib ID:

> otool -L cpplib/bin/libcpp2rs.dylib 
cpplib/bin/libcpp2rs.dylib: 
    @rpath/libcpp2rs.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 

rustc使用dylib ID为连锁型的参考,如果你想改变联动型对于一个图书馆@loader_path例如,你必须修复dylib ID。它应该看起来像:

@loader_path/libcpp2rs.dylib (compatibility version 0.0.0, current version 0.0.0) 
相关问题