我正在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"
块不在正确的位置有关?正确的方法是什么?