4

私はdllを持っています、それは関数をエクスポートします...

extern "C"
int __stdcall
MP_GetFactory( gmpi::IMpUnknown** returnInterface )
{
}

これを Code::Blocks GCC コンパイラ (V3.4.5) でコンパイルします。問題: 結果の dll エクスポートは、装飾された関数名を...

MP_GetFactory@4

これはロードに失敗します。普通の古いはずです...

MP_GetFactory

私はこれを約4時間調査しました。--add-stdcall-alias はこれを修正するオプションだと思います。My Code::Blocks ログが表示されます...

mingw32-g++.exe -shared -Wl,--out-implib=bin\Debug\libGainGCC.a -Wl,--dll obj\Debug\se_sdk3\mp_sdk_audio.o obj\Debug\se_sdk3\mp_sdk_common.o obj\Debug \Gain\Gain.o obj\Debug\Gain\gain.res -o bin\Debug\GainGCC.sem --add-stdcall-alias -luser32

..だから、それが正しい選択肢だと思いますか?しかし、運がありません。Dependancy Walker は、エクスポートされている装飾された名前のみを表示します。__stdcall の代わりに __cdecl を使用してちょっとした作業を行いました。その後、名前は正常にエクスポートされますが、関数が呼び出されるとスタックが破損します (呼び出し元が他の呼び出し規則を予期していたため)。

4

2 に答える 2

5

私自身の質問に答えて申し訳ありませんが、最終的にそれを理解しました。

プロジェクト/ビルド オプション/リンカ/その他のリンカ オプション -Wl,--kill-at

...装飾 '@' 記号などを削除します。

于 2010-03-24T07:35:33.470 に答える
1

-Wl,--add-stdcall-alias である必要があると思います。「kill-at」トリックにより、生成されたインポート ライブラリ ファイルが使用できなくなります。

于 2014-04-24T14:56:17.760 に答える