如何将用 Rust 编写的函数导出到 C 代码?

How can I export a function written in Rust to C code?

我第一次尝试使用 Rust 的 FFI 系统和 bindgen。到目前为止,它比我预期的要好,但我现在遇到了障碍。

我的设置如下:我有一个用 C 编写的库,我可以对其进行编译,它公开了一些函数声明供用户定义。所以让我们假设一个 header 有以下声明:

extern void ErrorHandler(StatusType Error);

有了 bindgen,我现在在 bindings.rs:

中也“声明”了这个函数 (?)
extern "C" {
    pub fn ErrorHandler(Error: StatusType);
}

我现在如何在我的 Rust 代码中定义函数?

我试过了:

#[no_mangle]
pub extern "C" fn ErrorHandler(Error: StatusType) {
  /* do something */
}

但是现在我收到以下错误,告诉我该函数被定义了两次:

4585 |     pub fn ErrorHandler(Error: StatusType);
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `ErrorHandler` redefined here
     |
    ::: src\main.rs:7:1
     |
7    | pub extern "C" fn ErrorHandler(Error: StatusType) {
     | ---------------------------------------------- previous definition of the value `ErrorHandler` here
     |
     = note: `ErrorHandler` must be defined only once in the value namespace of this module

感谢您的帮助!

问题出在 bindgen 的前向声明中。与 C 和 C++ 不同,Rust 没有前向声明。所以删除这个:

extern "C" {
    pub fn ErrorHandler(Error: StatusType);
}

并保留这个:

#[no_mangle]
pub extern "C" fn ErrorHandler(Error: StatusType) {
  /* do something */
}