vc ++の__stdcallのエクスポートされた名前の装飾を変更するにはどうすればよいですか?
-
12-10-2019 - |
質問
これは、現在輸出機能が宣言されている方法です。
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ファイルの方法は、ほぼ唯一のソリューションです。
はい:
あなたは付け加えられます /EXPORT
に lib.exe
コマンドライン、またはaを追加します #pragma
ソースファイルへ:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
またはさらに簡単:関数の本体の内部
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)