如何将用 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 */
}
我第一次尝试使用 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 */
}