为什么在Rust模块中定义了调用带有字符串的FFI函数时不起作用?

时间:2019-05-21 18:13:44

标签: rust ffi

我正在Rust中创建一个动态库C插件(“ cdynlib”)。 C代码中有一个info()函数,但是当我尝试从Rust模块中调用此info()函数时,它将无法正常工作。

当我将所有内容都放在同一个Rust文件中时它确实可以工作,但是我不想这样做,因为我必须制作多个插件并且希望能够在info()上重用安全的包装器。< / p>

这是有效的方法(plugin.rs):

extern "C" {
    fn info(message: *const c_char);
}
fn log(message: &str) {
    unsafe { info(CString::new(message).unwrap().as_ptr()); }
}

#[no_mangle]
pub extern fn init() {
    log("this message gets through");
}

但是当我将以下内容移至logging.rs时:

extern "C" {
    fn info(message: *const c_char);
}
pub fn log(message: &str) {
    unsafe { info(CString::new(message).unwrap().as_ptr()); }
}

并从plugin.rs中使用它:

#[no_mangle]
pub extern fn init() {
    logging::log("this message does not get through");
}

插件加载后消息无法通过

我希望日志记录模块中的代码的行为与插件文件中的代码相同,但事实并非如此。也许这与extern "C"块不在正确的位置有关?正确的方法是什么?

0 个答案:

没有答案