2008-09-20 45 views
8

Visual Studio 2008で__stdcallを使用してdllをコンパイルすると、dll内のコンパイルされた関数名が表示されます。我々はWX-DEV-CPPを使用してGCCを使用して同じDLLをコンパイルするとき__stdcallでdllをコンパイルするGCC

FunctionNameは

はしかしGCCは、関数がありparamersの数を追加し、その依存関係ウォーカーを使用して関数の名前は次のようになります。 8

@ numberOfParametersまたは== FunctionNameは@

FunctionNameはどのようにDLL内のエクスポートされたシンボルから@nn削除するGCCコンパイラを教えていますか?

答えて

5

__stdcallは、先頭にアンダースコアを、最後にパラメータのバイト数を@で区切って、関数名を修飾します。

ので、機能:

void __stdcall Foo(int a, int b); 

は... 8 @ _FOOなります。

.DEFファイルのEXPORTSセクションに関数名(デコレーションされていない)を表示すると、undecoratedにエクスポートされます。

おそらくこれは違いですか?

+0

返信いただきありがとうございました。別の開発者がDEFファイルをプロジェクトに配置したという問題が発生していました。このDEFファイルは、DLL内で使用する命名規則をリンカーに指示しました。これが、同じ呼び出し規約でも異なるライブラリ名を取得した理由です。 解決策は、開発者の1人が、プロジェクト用に独自のDLLを作成するときにヘッダーファイルからWINAPIを削除したことが判明しました。これにより、Windows Visual Studioが__cdecl(/ Gd)のデフォルトの呼び出し規約に戻っていました。 – Chad

0

あなたはまた、GCCであなたのリンカオプションへ-Wl,--add-stdcall-aliasを使用することができます。これにより、関数名(装飾されていないものと装飾されていないもの)が両方とも存在し、エイリアスとして使用できることが保証されます。

+0

マティアスはこれを知らなかった。 – Chad

関連する問題