由于名称损坏而未解决的外部符号

NoN*_*ame 5 c++ linker name-mangling

我将XERCES函数从2.6升级到2.8时面临链接器错误

unresolved external symbol (?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QBG0@Z)
Run Code Online (Sandbox Code Playgroud)

我检查了xerces-c_2.8.lib,发现名称lib与我的.obj文件中的名称有点不同它如图所示

?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QB_W0@Z
Run Code Online (Sandbox Code Playgroud)

所以我理解链接器不会找到匹配并抛出错误.

但我无法理解为什么我的.obj文件包含不同的签名.

代码包括正确的头文件和来自仍然不正确的名称的lib.

任何帮助,将不胜感激.

Han*_*ant 14

您可以使用undname.exe实用程序来恢复原始C++声明.

?resolveEntity @ HandlerBase @ xercesc_2_8 @@ UAEPAVInputSource @ 2 @ QBG0 @ Z转换为:

virtual class xercesc_2_8::InputSource * 
__thiscall xercesc_2_8::HandlerBase::resolveEntity(
    unsigned short const * const,
    unsigned short const * const)
Run Code Online (Sandbox Code Playgroud)

?resolveEntity @ HandlerBase @ xercesc_2_8 @@ UAEPAVInputSource @ 2 @ QB_W0 @ Z转换为:

virtual class xercesc_2_8::InputSource * 
__thiscall xercesc_2_8::HandlerBase::resolveEntity(
     wchar_t const * const,
     wchar_t const * const)
Run Code Online (Sandbox Code Playgroud)

注意参数类型的差异,unsigned shortvs wchar_t.由于某种原因,您的编译器无法识别wchar_t类型.那可能是因为你有一个非常古老的编译器.或者它可能是一个选项设置错误,在msvc上它是C/C++,语言,"将wchar_t视为内置类型".或者你有一个将字符串类型破解为unsigned short的宏.