Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Можно ли используя язык Си, вызывать функции из библиотек, написанных на C++, или вообще из каких либо библиотек, написанных не на Си?

ПрограммированиеC++Язык си
Пианино 55
  · 1,0 K
Разработчик программного обеспечения  · 26 дек 2019

Можно. Для этого функции в коде библиотеки c++ должны быть объявлены как extern "C". Таким образом вы сообщаете компилятору, что он должен добавить в библиотеку символ, точно совпадающий с именем функции (в противном случае компилятор c++ добавляет в имя функции дополнительную информацию – это т.н. mangling, позволяющий решить проблему коллизий имен).

  • Пример без extern "C":

int foo(int a) {

return a * 2;

}

$ g++ mylib.c -shared -o libmylib.so

$ objdump -T libmylib.so

libmylib.so: file format elf64-x86-64

DYNAMIC SYMBOL TABLE:

...

00000000000010e9 g DF .text 000000000000000e Base _Z3fooi

  • С extern "C":

extern "C" int foo(int a) {

return a * 2;

}

$ g++ mylib.c -shared -o libmylib.so

$ objdump -T libmylib.so

libmylib.so: file format elf64-x86-64

DYNAMIC SYMBOL TABLE:

...

00000000000010e9 g DF .text 000000000000000e Base foo