首先,这一切都是用 MS VS 完成的。
程序崩溃并显示“过程入口点?FunName@ClassName@@QAE_NXZ 无法在动态链接库 XXX.dll 中找到”
我在依赖walker中打开了XXX.dll,我能找到的只有
FunName@ClassName@@QBE_NXZ,而不是 FunName@ClassName@@QAE_NXZ。
我知道重建 XXX.dll 会解决这个问题,但 QBE_NXZ 和 QAE_NXZ 有什么区别?
c++ 名称修饰也是编译器特定的吗?
您可以使用undname.exe
Visual 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
程序来解开名称。