2017-06-12 8 views
0

Je souhaite appeler les différentes fonctions définies dans un dylib Rust en utilisant Crystal. J'ai parcouru le manuel, mais je n'ai pas pu le comprendre. Comment puis-je inclure et appeler correctement ce dylib? Suis-je en utilisant les drapeaux CLI mal?Comment appeler des fonctions d'un dylib en utilisant Crystal?

Voici le code cristal:

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

Je compilé une dylib en utilisant this repo. Le code compile bien à un 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

Sans un message d'erreur, il est difficile d'aider toi. – RX14

+2

Il est cependant probable que vous deviez spécifier le chemin d'accès complet au dylib, à moins qu'il ne soit déjà dans les chemins de recherche de l'éditeur de liens par défaut (auquel cas vous le liez comme 'my_dylib' pas' libmy_dylib') – RX14

Répondre

1

Vous devez spécifier le dylib avec un chemin absolu, et le transmettre par ldflags. Par exemple, le fichier suivant Rust

extern crate libc; 

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

qui compile à libmy_dylib.dylib peuvent être liés comme ceci:

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

MyDylib.hello 

Et le programme compilera pour imprimer "Hello from Rust!"

+0

Merci @hafiz :) –