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

Пианино ПятьдесятПять
  · 873
Разработчик программного обеспечения

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

Комментировать ответ…
Вы знаете ответ на этот вопрос?
Поделитесь своим опытом и знаниями
Войти и ответить на вопрос