質問

Visual Studio 2008 内で __stdcall を使用して DLL をコンパイルすると、DLL 内のコンパイルされた関数名は次のようになります。

関数名

ただし、wx-dev-cpp を使用して GCC を使用して同じ DLL をコンパイルすると、GCC は関数が持つパラメーターの数を追加するため、Dependency walker を使用した関数の名前は次のようになります。

FunctionName@numberOfParameters または == FunctionName@8

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

役に立ちましたか?

解決

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

したがって、関数は次のようになります。

void __stdcall Foo(int a, int b);

..._Foo@8 になります。

.DEF ファイルの EXPORTS セクションに関数名 (装飾なし) をリストすると、装飾なしでエクスポートされます。

おそらくこれが違いでしょうか?

他のヒント

ただ使用してください -Wl,--kill-at gcc コマンドラインで、これは渡されます --kill-at リンカーに。

参考文献:

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

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