2017-06-12 3 views
0

Ich möchte die verschiedenen Funktionen, die in einer Rust-Dylib definiert sind, mit Crystal aufrufen. Ich habe das Handbuch durchgelesen, aber ich konnte es nicht verstehen. Wie kann ich diesen Dylib richtig einbeziehen und aufrufen? Verwende ich die CLI-Flags falsch?So rufen Sie Funktionen von einer Dylib mit Crystal auf?

Hier ist der Kristall-Code:

@[Link("libmy_dylib")] 
lib MyDylib 
    # In C: double cos(double x) 
    # In Rust: print_number(x:i32) 
    fun print_number(value : Int32) 
end 

MyDylib.print_number(10) 

ich ein dylibthis repo mit zusammengestellt. Der Code kompiliert fein zu einem libmy_dylib.dylib:

extern crate libc; 

use libc::uint32_t; 

#[no_mangle] 
pub extern "C" fn hello() { 
    println!("Hello from Rust!"); 
} 

#[no_mangle] 
pub extern "C" fn print_number(x: i32) { 
    println!("x is: {}", x); 
} 

#[no_mangle] 
pub extern "C" fn addition(a: uint32_t, b: uint32_t) -> uint32_t { 
    let c = a + b; 
    println!("Sum : {}", c); 

    return a + b; 
} 

#[allow(dead_code)] 
pub extern "C" fn fix_linking_when_not_using_stdlib() { 
    panic!() 
} 
+1

Ohne eine Fehlermeldung zu drucken, es ist schwer zu helfen Sie. – RX14

+2

Es ist wahrscheinlich, dass Sie den vollständigen Pfad zum dylib angeben müssen, es sei denn, es befindet sich bereits in den Linker-Suchpfaden (in diesem Fall verknüpfen Sie es als 'my_dylib' und nicht' libmy_dylib') – RX14

Antwort

1

Sie müssen die dylib mit einem absoluten Pfad angeben, und führt es durch ldflags. Zum Beispiel Datei die folgende Rust

extern crate libc; 

#[no_mangle] 
pub extern "C" fn hello() { 
    println!("Hello from Rust!") 
} 

, die libmy_dylib.dylib kompiliert kann wie folgt verknüpft werden:

@[Link(ldflags: "/absolute/path/to/libmy_dylib.dylib")] 
lib MyDylib 
    fun hello : Void 
end 

MyDylib.hello 

Und das Programm kompiliert "Hello from Rust!"

+0

Danke @hafiz :) –

Verwandte Themen