Использование C ++ искаженных функций из C

У меня есть файл .lib, исходный код которого у меня нет.

Мне нужна экспортированная функция из нее, но я пишу на C, а функция написана по имени C ++. Я не могу написать extern "C"потому что у меня нет исходного кода.

Как связать искаженную функцию без исходного кода и переключения на C ++?

5

Решение

Сделайте C ++ обертку:

wrapper.cpp:

#include "3rdparty.hpp"
extern "C" int foo(int a, int b)
{
return third_party::secret_function(a, b);
}

consumer.c:

extern int foo(int, int);

// ...

Телосложение: (например, с GCC)

g++ -o wrapper.o wrapper.cpp
gcc -o consumer.o consumer.c
g++ -o program consumer.o wrapper.o -l3rdparty
12

Другие решения

Напишите свою собственную оболочку C ++ для этих функций и объявите свои функции-оболочки с помощью extern "C",

Я не знаю другого пути.

5

Искаженное имя из .lib-файла может быть вызвано из вашей c-программы. Если .lib, на который вы ссылаетесь, стабилен и не перекомпилируется / не обновляется постоянно, это решение может работать для вас.

Я не очень знаком с окнами, но Как просмотреть содержимое библиотеки Windows (* .lib) или другой поиск должен показать, как эта информация может быть получена из .lib

Ищите имя функции в выводе, большинство искалечений оставит имя нетронутым и просто украсит его всевозможной другой информацией.

Поместите это имя в свой код C с пояснительным комментарием …

1

Предположим, у вас есть файл .c (FileC.c), и вы хотите вызвать функцию, определенную в .cpp (FileC ++. Cpp). Давайте определим функцию в файле C ++ как:

void func_in_cpp(void)
{
// whatever you wanna do here doesn't matter what I am gonna say!
}

Выполните следующие шаги сейчас (чтобы иметь возможность вызывать вышеуказанную функцию из
файл .c):

1) С вами обычный компилятор C ++ (или www.cpp.sh), напишите очень простую программу, включающую имя вашей функции (func_in_cpp). Скомпилируйте вашу программу. Например.

$ g++ FileC++.cpp -o test.o

2) Найдите искаженное название вашей функции.

$ nm test.out | grep -i func_in_cpp
[ The result should be "_Z11func_in_cppv" ]

3) Зайдите в свою C-программу и сделайте две вещи:

void _Z11func_in_cppv(void);  // provide the external function definition at the top in your program. Function is extern by default in C.

int main(void)
{
_Z11func_in_cppv();   // call your function to access the function defined in .cpp file
}
1
По вопросам рекламы [email protected]