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

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

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

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

4 ответа

Решение

Сделайте 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

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

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

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

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

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

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

Предположим, у вас есть файл.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++ (или http://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
}
Другие вопросы по тегам