2016-05-04 16 views
2

Ich versuche, ein Problem mit dem Laden von fremden Bibliotheken mit Rust zu lösen.Rost und Ladepfade (@rpath, @loader_path) auf OS X

Eingänge:

Ich habe eine ausführbare rtest und dylib libcpp2rs.dylib. Die Bibliothek ist an die ausführbare Datei durch FFI verbunden:

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

Meine build.rs Datei (ich vorbei ein zusätzliches Argument mit libcpp2rs.dylib Standort):

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

Und meine Cargo.toml Datei:

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

Und ich verwende cargo build Befehl zum Kompilieren.

Ausgänge:

otool zeigt mir, dass Bibliothek von RPATH geladen werden:

> 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) 

Aber zugleich gibt es keine LC_LPATH Abschnitt in ausführbarer:

> otool -l rtest | grep LC_RPATH 
> 

Und es führt meine Anwendung zu einem Ladefehler:

> ./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 

Dieses Problem kann durch install_name_tool Verwendung behoben werden, aber ich bevorzuge keine zusätzlichen Schritte in den Kompilierungsprozess einzuführen.

  1. Ist es möglich (und wie) Ladetyp von @rpath zu ändern Skript mit cargo Konfigurationen/bauen @loader_path?
  2. Kann @rpath-Wert an cargo übergeben werden?
+0

Bitte [Bearbeiten] Ihre Frage zu schließen, wo 'libcpp2rs.dylib' befindet, wie Sie informiert Rust, wo es ist, und wie Sie den Code bauen. – Shepmaster

Antwort

2

Nach einigen Untersuchungen um habe ich festgestellt, dass das eigentliche Problem ist 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 verwendet eine dylib ID als Referenz für den Bindungstyp und wenn Sie möchten, dass Verknüpfung Typen ändern für eine Bibliothek zu @loader_path zum Beispiel müssen Sie Dylib ID beheben. Es sollte wie folgt aussieht:

@loader_path/libcpp2rs.dylib (compatibility version 0.0.0, current version 0.0.0)