GCC が __stdcall で DLL をコンパイルする
-
01-07-2019 - |
質問
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 のリンカー オプションに追加します。これにより、両方の関数名 (装飾されたものと装飾されていないもの) が存在し、エイリアスとして使用できるようになります。
所属していません StackOverflow