vc ++の__stdcallのエクスポートされた名前の装飾を変更するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4498452

質問

これは、現在輸出機能が宣言されている方法です。

extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();

VS2008がこのソースをコンパイルしたとき、作成されたDLLにはエクスポートテーブルの下にこれが含まれています。

_GetExported_Class@0

他のコンパイラとの互換性については、代わりにこのように見えるように上記の装飾が必要です。

GetExported_Class

呼び出し条約を__cdeclに変更すると、私が望むようにそれを飾りますが、慣習は間違っているので、それを使用できません。 __cdeclの見た目で装飾する必要がありますが、代わりに__stdcallを使用します。

とにかくこれをするためにありますか それなし .defファイルを使用しますか? link.exeリンカーに渡すことができるスイッチまたはオプションがあります。

ありがとう

役に立ちましたか?

解決

いいえ。すべての__stdcall名はこのように装飾されています。 __stdcallエクスポートがこのように装飾されるとは思わない他のコンパイラがあることに驚いています。 .defでリンカーをオーバーライドすることは、生産後にPEファイルを変更したい場合を除き、できることはほとんどすべてです。

他のヒント

.defファイルを使用したくない理由がわかりませんが、これが唯一のオプションです。

リンカーはエクスポートスイッチをサポートしますが、__stdcall注釈付きの関数では使用することはできません。

http://msdn.microsoft.com/en-us/library/7k30y2k5.aspx

DEFファイルの方法は、ほぼ唯一のソリューションです。

はい:

あなたは付け加えられます /EXPORTlib.exe コマンドライン、またはaを追加します #pragma ソースファイルへ:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

またはさらに簡単:関数の本体の内部

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

ソース: https://stackoverflow.com/a/2805560/280534

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top