8

次の行のコードが少しあります

  #pragma comment(linker, "/include:_test@12") 

このコードを使用するプロジェクトは、構成タイプ32ビットのC ++ Visual Studio 2010を使用してコードをコンパイルすると正常に機能します(私も32ビットWindowsマシンを使用しています)。

マシンを64ビットに変更し、C ++ Visual Studio 2010でコンパイルするx64構成を使用すると、リンクエラーが発生します。

C ++の名前マングリングは32ビットと64ビットで異なりますか?もしそうなら、64ビットC ++の名前マングリング規則はどこにありますか?

4

1 に答える 1

10

はい、名前マングリングは 32 ビットと 64 ビットで異なります。正確なフォーマットをカバーする適切な記事は、ここにあります。ただし、両方のターゲットにコンパイルし、結果のマップ ファイルを調べるだけで、主な違いをすぐに確認できます。私の経験からすると、それらはほとんど同じです (64 ビットは小さなデータを追加し、他のデータを変更する可能性があります)。

簡単なサンプル:void foo();

32bit: ?foo@A@@QAEXXZ
64bit: ?foo@A@@QEAAXXZ

マングルされていない std 呼び出しの場合、パラメーター スタックの使用状況に応じて、長さのサフィックスが大幅に異なる場合があります。VC++ のデフォルトの 64 ビット設定では、先頭にアンダースコアを追加したり、長さのサフィックスをエンコードしたりしません。以下は、32 ビットと 64 ビットの両方の構成を、すぐに使用できる純粋な設定でコンパイルしたものです。

extern "C" int _stdcall func2(int, int, char*);

32bit: _func2@12
64bit: func2

そこにはあまり意味がありません。

_cdecl を分解して回路を完成させると、次のようになります。

extern "C" int _cdecl func2(int, int, char*);

32bit: _func2
64bit: func2

彼らがあなたが何をプルインまたはエクスポートしているのかをあなたに知らせるために邪魔をしたように見える場合、証拠はあなたがおそらく正しいことを示唆しています.

于 2012-11-14T19:37:53.593 に答える