Как я могу экспортировать функцию, написанную на Rust, в код C?
Я впервые работаю с системой Rust FFI и bindgen. Пока все идет лучше, чем я ожидал, но теперь я столкнулся с препятствием.
Моя установка такова: у меня есть библиотека, написанная на C, которую я могу скомпилировать и которая предоставляет некоторые объявления функций для определения пользователем. Итак, давайте предположим, что один заголовок имеет следующее объявление:
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
Спасибо за помощь!
1 ответ
Проблема возникает из-за предварительного объявления от bindgen. Rust, в отличие от C и C++, не имеет предварительного объявления. Итак, удалите это:
extern "C" {
pub fn ErrorHandler(Error: StatusType);
}
и сохранить это:
#[no_mangle]
pub extern "C" fn ErrorHandler(Error: StatusType) {
/* do something */
}