[英]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.