Как вызывать функции из файлов заголовков (.h) в C++?

Как можно связать библиотеку, написанную на C++, с кодом на Rust для использования на Windows?
  • 9 июля 2024 г. 19:22
Ответы на вопрос 2
1. Для вызова функций из файлов заголовков (.h) в C++, необходимо выполнить следующие шаги:
   - Включить заголовочный файл в файле исходного кода с помощью директивы #include.
   - Объявить прототипы функций из заголовочного файла в своем исходном файле.
   - Реализовать вызов этих функций в своем исходном файле.

Например, если у вас есть файл заголовка sample.h:
```cpp
// sample.h
#ifndef SAMPLE_H
#define SAMPLE_H

void myFunction();

#endif
```

И файл исходного кода sample.cpp:
```cpp
// sample.cpp
#include "sample.h"
#include <iostream>

void myFunction() {
    std::cout << "Hello, world!" << std::endl;
}
```

Вам нужно включить заголовочный файл sample.h в своем коде и вызвать функцию myFunction:
```cpp
// main.cpp
#include "sample.h"

int main() {
    myFunction();
    return 0;
}
```

2. Чтобы связать библиотеку, написанную на C++, с кодом на Rust для использования на Windows, вам потребуется использовать межъязыковое взаимодействие. Наиболее распространенным способом связывания кода на Rust с кодом на C++ является использование FFI (Foreign Function Interface).

Для этого необходимо выполнить следующие шаги:
   - Определить интерфейс для взаимодействия между Rust и C++.
   - Создать C-обертки для функций из библиотеки на C++, которые будут вызывать соответствующие функции на Rust.
   - Скомпилировать код на Rust и C++ с использованием подходящих флагов компилятора, чтобы создать динамическую библиотеку (.dll или .so) и объектные файлы.
   - Подключить созданные библиотеки к вашему проекту на Rust и вызывать функции из C++ через обертки на C.

Более подробную информацию о связывании кода на Rust с кодом на C++ можно найти в документации по FFI для Rust.
Скорее всего придётся сделать extern C обёртку над библиотекой и биндится уже с ней. Ну и надо понимать, что никакие абстракции плюсов вроде темплейтов, классов и т.д. в раст не протащить. 

В какой-то степени может помочь cxx , но надо понимать, что эта штука тоже не всесильна.
Похожие вопросы