2017-06-12 76 views
0

我希望使用Crystal調用Rust dylib中定義的各種函數。我已經閱讀了手冊,但我無法理解它。我如何正確包含並調用這個dylib?我使用CLI標誌是否錯誤?如何使用Crystal從dylib調用函數?

這裏的水晶代碼:

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

我使用this repo編譯一個dylib。代碼編譯細到一個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

沒有很難幫助的錯誤信息您。 – RX14

+2

可能你必須指定dylib的完整路徑,除非它已經在默認鏈接器搜索路徑中(在這種情況下,你將它鏈接爲'my_dylib'而不是'libmy_dylib') – RX14

回答

1

你需要指定絕對路徑的dylib,並使之通過ldflags。例如,下面的鏽文件

extern crate libc; 

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

編譯爲libmy_dylib.dylib可以鏈接如下:

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

MyDylib.hello 

,程序會編譯打印"Hello from Rust!"

+0

謝謝@hafiz :) –