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

时间:2012-09-28 12:35:08

标签: c++ linker name-mangling

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

unresolved external symbol (?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QBG0@Z)

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

?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QB_W0@Z

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

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

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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)

?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)

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

答案 1 :(得分:0)

C ++允许函数重载,因此函数的参数记录在名称修改中。您可能尝试使用不同于DLL期望的参数类型来调用函数。

确保您的头文件与您的DLL版本匹配。