2017-06-12 75 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 :) –