5

私は.libファイルを持っていますが、そのソースコードは持っていません。

そこからエクスポートされた関数が必要ですが、Cで記述しており、関数はC++の名前修飾されています。extern "C"ソースコードがないので書けません。

ソースコードなしでマングルされた関数をリンクし、C ++に切り替えるにはどうすればよいですか?

4

4 に答える 4

12

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

これらの関数に独自のC++ラッパーを記述し、ラッパー関数をで宣言しますextern "C"

私は他の方法を知りません。

于 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プログラムに移動し、次の2つのことを行います。

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 に答える