簡體   English   中英

使用C語言的C ++雜亂函數

[英]Using C++ mangled functions from C

我有一個.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不太熟悉,但是如何查看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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM