У меня есть файл .lib, исходный код которого у меня нет.
Мне нужна экспортированная функция из нее, но я пишу на C, а функция написана по имени C ++. Я не могу написать extern "C"
потому что у меня нет исходного кода.
Как связать искаженную функцию без исходного кода и переключения на C ++?
Сделайте 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 ++ (или 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
}