0

まず、これはすべて MS VS で行われます。

「The procedure entry point ?FunName@ClassName@@QAE_NXZ could not be found in the dynamic link library XXX.dll」でプログラムがクラッシュする

依存関係ウォーカーで XXX.dll を開きましたが、見つけることができるのは

FunName@ClassName@@QBE_NXZ 、FunName@ClassName@@QAE_NXZ ではありません。

XXX.dll を再構築するとこれが修正されることはわかっていますが、QBE_NXZ と QAE_NXZ の違いは何ですか?

また、C ++の名前マングリングはコンパイラ固有ですか?

4

1 に答える 1

3

undname.exeVisual Studioに付属のユーティリティを使用して、名前のマングルを解除できます。この場合:

C:\>undname "?FunName@ClassName@@QAE_NXZ"
Undecoration of :- "?FunName@ClassName@@QAE_NXZ"
is :- "public: bool __thiscall ClassName::FunName(void)"


C:\>undname "?FunName@ClassName@@QBE_NXZ"
Undecoration of :- "?FunName@ClassName@@QBE_NXZ"
is :- "public: bool __thiscall ClassName::FunName(void)const "

ご覧のとおり、違いはメンバー関数がそうであるかどうかconstです。

名前マングリングはコンパイラ固有です。GCCの場合、c++filtプログラムを使用して名前のマングルを解除できます。

于 2012-12-04T17:06:44.673 に答える