1

Eclipse で c++ を使用してプラグイン DLL を作成しています。

プラグインをロードしようとすると、エラーが発生します。

?CTC_Cleanup@YAXXZ not found. Function is not available in myplugin.dll

Dependency Walker を使用して別の動作中のプラグインと私のプラグインを比較すると、他のプラグインの関数名が , enable であることに気付きまし"void CTC_Cleanup(void)""Undecorate C++ functions" => "?CTC_Cleanup@YAXXZ"

私のプラグインでは、関数名は次のとおりです。"CTC_Cleanup"有効に"Undecorate C++ functions"しても違いはありません。

.h ファイル内の C++ 関数宣言はすべて、次のように装飾され"__declspec(dllexport)"、囲まれています。

extern "C" {
...
...
...
}

/クリストファー

4

3 に答える 3

1

マングルされた名前を探しているので、extern "C" は必要ありません。

?CTC_Cleanup@YAXXZ は、CTC_Cleanup という名前の void を受け取り、void を返す関数に VC++ 名マングリングを使用しています。

ただし、g++ 3.x または 4.x を使用しており、g++ は互換性のない別のマングリング スキームを使用しています。

VC++ を使用してライブラリをビルドするか、g++ で VC++ 名マングリングを使用する方法を見つけてください。

于 2009-12-16T16:14:20.610 に答える
0

C リンケージを使用する場合、引数名 (実際には引数の型、正式な名前はこのレベルでは重要ではありません) は重要ではありませんCでは、オーバーロードがないため、関数名自体で十分であり、引数の型は関係ありません。

于 2009-12-16T10:45:57.850 に答える
0

extern「C」を削除すると、機能するはずです。プラグインは、期待される名前で関数をエクスポートすると思います。

于 2009-12-16T10:49:43.840 に答える