我有一个 .lib 文件,我没有它的源代码。
我需要一个导出的函数,但我是用 C 语言编写的,并且该函数是 C++ 名称损坏的。我不会写extern "C"
,因为我没有源代码。
如何在没有源代码的情况下链接损坏的函数并切换到 C++?
我有一个 .lib 文件,我没有它的源代码。
我需要一个导出的函数,但我是用 C 语言编写的,并且该函数是 C++ 名称损坏的。我不会写extern "C"
,因为我没有源代码。
如何在没有源代码的情况下链接损坏的函数并切换到 C++?
Make C++ wrapper:
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);
// ...
Build: (e.g. with GCC)
g++ -o wrapper.o wrapper.cpp
gcc -o consumer.o consumer.c
g++ -o program consumer.o wrapper.o -l3rdparty
Write your own C++ wrapper over those functions and declare your wrapper functions with extern "C"
.
I'm not aware of any other way.
.lib 文件中的损坏名称可以在您的 c 程序中调用。如果您链接到的 .lib 是稳定的,并且不会不断地重新编译/更新,则此解决方案可能对您有用。
我对 Windows 不太熟悉,但如何查看 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
}