5

我有一个 .lib 文件,我没有它的源代码。

我需要一个导出的函数,但我是用 C 语言编写的,并且该函数是 C++ 名称损坏的。我不会写extern "C",因为我没有源代码。

如何在没有源代码的情况下链接损坏的函数并切换到 C++?

4

4 回答 4

12

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
于 2012-09-11T13:58:11.643 回答
5

Write your own C++ wrapper over those functions and declare your wrapper functions with extern "C".

I'm not aware of any other way.

于 2012-09-11T13:57:43.423 回答
1

.lib 文件中的损坏名称可以在您的 c 程序中调用。如果您链接到的 .lib 是稳定的,并且不会不断地重新编译/更新,则此解决方案可能对您有用。

我对 Windows 不太熟悉,但如何查看 Windows 库 (*.lib) 的内容或其他搜索应该显示如何从 .lib 获取此信息

在输出中搜索函数的名称,大多数修改都会保持名称不变,只是用各种其他信息装饰它。

将该名称放在您的 C 代码中,并带有解释性注释...

于 2014-12-02T21:27:31.133 回答
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
}
于 2018-07-20T15:24:16.190 回答