Использование 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
}