如何使用Crystal调用dylib中的函数?

问题描述 投票:0回答:1

我希望使用Crystal调用Rust dylib中定义的各种函数。我已经阅读了手册,但我无法理解它。如何正确包含并调用此dylib?我使用CLI标志错了吗?

这是水晶代码:

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

我用dylib编译了一个this repo。该代码编译为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!()
}
ffi dylib crystal-lang
1个回答
1
投票

您需要使用绝对路径指定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!"

© www.soinside.com 2019 - 2024. All rights reserved.