首先这一切都是用 MS VS 完成的。
程序崩溃 “程序入口点 ?FunName@ClassName@@QAE_NXZ 无法位于动态链接库 XXX.dll 中”
我在 dependency walker 中打开了 XXX.dll,我能找到的只有
FunName@ClassName@@QBE_NXZ,不是 FunName@ClassName@@QAE_NXZ。
我知道重建 XXX.dll 可以解决这个问题,但 QBE_NXZ 和 QAE_NXZ 之间有什么区别?
C++ 名称修改是否也是特定于编译器的?
最佳答案
您可以使用 Visual Studio 随附的 undname.exe
实用程序来取消命名。在这种情况下:
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
程序来分解名称。
关于C++ 命名修饰 : QBE_NXZ QAE_NXZ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707980/