Знатоки теперь на Кью! Присоединяйтесь к новому сервису ЯндексаПерейти

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

Интересный вопрос
Лучший ответ
Разработчик программного обеспечения

Можно. Для этого функции в коде библиотеки 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

1
Написать комментарий

0/140Ответ не может быть меньше 140 символов