2012-12-04 76 views
0

首先这一切都是用MS VS完成的。C++命名修剪:QBE_NXZ QAE_NXZ

与 程序崩溃“程序输入点?FunName @类名@@ QAE_NXZ不能设在动态链接库XXX.dll”

我在Dependency Walker中打开XXX.dll和所有我能找到是

FunName @ ClassName @@ QBE_NXZ,Not FunName @ ClassName @@ QAE_NXZ。

我知道重建XXX.dll会解决这个问题,但是QBE_NXZ & QAE_NXZ有什么区别?

也是C++名称mangling是编译器特定的吗?

+1

名称mangling确实是编译器特有的。 –

+1

这里你去:http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling ---祝你好运! :) – NPE

+0

感谢维基链接以及 – Gob00st

回答

3

您可以使用Visual Studio附带的undname.exe实用程序来取消名称。在这种情况下:

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


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

因此,大家可以看到不同的是成员函数是否const与否。

名称修改是编译器特定的。对于GCC,您可以使用c++filt程序来取消名称。

+0

感谢这很好地工作,而无需查看大的VS名称mangling wiki页面:)而且我怀疑有人做了没有从Perforce完全同步的构建,所以const不包括和后来的版本确实有这个常量! – Gob00st