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
的用法修复,但我更喜欢在编译过程中不引入其他步骤。
- 是否有可能(以及如何)从@rpath改变负载类型与
cargo
配置,@loader_path /构建脚本? - 是否可以将@rpath值传递给
cargo
?
请编辑您的问题以包括libcpp2rs.dylib位于何处,您如何通知Rust它在哪里以及如何构建代码。 – Shepmaster