From 9bdf3e52492f359b90ed8f0d399280b8a7983680 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Mon, 6 Nov 2023 02:12:29 +0300 Subject: [PATCH] use cpp in c --- content/posts/2023/c/use-cpp-code-in-c.md | 92 +++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 content/posts/2023/c/use-cpp-code-in-c.md diff --git a/content/posts/2023/c/use-cpp-code-in-c.md b/content/posts/2023/c/use-cpp-code-in-c.md new file mode 100644 index 0000000..2ac6ccc --- /dev/null +++ b/content/posts/2023/c/use-cpp-code-in-c.md @@ -0,0 +1,92 @@ +--- +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 + +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 + +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/)