如何使用 Crystal 从 dylib 调用函数?
How to call functions from a dylib using Crystal?
我希望使用 Crystal 调用 Rust dylib 中定义的各种函数。我已经阅读了手册,但我无法理解它。如何正确包含和调用此 dylib?我使用的 CLI 标志有误吗?
这是 Crystal 代码:
@[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!()
}
需要用绝对路径指定dylib,通过ldflags
传递。例如,下面的 Rust 文件
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!"
我希望使用 Crystal 调用 Rust dylib 中定义的各种函数。我已经阅读了手册,但我无法理解它。如何正确包含和调用此 dylib?我使用的 CLI 标志有误吗?
这是 Crystal 代码:
@[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!()
}
需要用绝对路径指定dylib,通过ldflags
传递。例如,下面的 Rust 文件
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!"