Blog/content/posts/2023/c/use-cpp-code-in-c.md
2023-11-06 02:12:29 +03:00

93 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "⚙️ Использование C++ кода в Си"
date: 2023-11-06T01:29:12+03:00
draft: false
tags: [c, cpp, tutorial, development]
---
## Введение
В данном руководстве на паре простых примеров покажу,
как использовать в программе на Си код на языке C++.
## Реализация динамическй библиотеки
Напишем функцию `void f(int i)` на C++, которая выводит в терминал число.
```cpp
// lib.cpp
#include <iostream>
extern "C" void f(int);
void f(int i) {
std::cout << i << std::endl;
}
```
Программа на Си, которая вызывает функцию C++ `f()`:
```c
// main.c
void f(int i);
int main(void) {
f(13);
return 0;
}
```
Компиляция
```sh
g++ -fpic -shared src/lib.cpp -o libaaa.so
gcc src/main.c -L. -laaa -o app
# Запуск
LD_LIBRARY_PATH=. ./app
```
## Реализация статической библиотеки
Функция на C++, которая выводит в терминал `int`.
```cpp
// lib.cpp
#include <iostream>
extern "C" {
void print_cout(const char *str) {
std::cout << str << std::endl;
}
}
```
Программа на Си, которая вызывает функцию C++:
```c
// main.c
void print_cout(const char *);
int main(void) {
print_cout("hello world!");
return 0;
}
```
Компиляция
```sh
gcc -c src/main.c -o main.o
g++ -c src/e.cpp -o aaa.o
g++ -o app main.o aaa.o
# Запуск
./app
```
## Полезные ссылки
- [How to mix C and C++](https://isocpp.org/wiki/faq/mixing-c-and-cpp)
- [Creating a shared and static library with the GNU compiler (gcc)](https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/GCC/create-libraries/index)
- [Using Static C++ Library in C](https://cplusplus.com/forum/general/284264/)