Как я могу экспортировать функцию, написанную на 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 */
}
Другие вопросы по тегам