我将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。
任何帮助都将不胜感激。
答案 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 short
与wchar_t
。由于某种原因,您的编译器无法识别wchar_t类型。那可能是因为你有一个非常古老的编译器。或者它可能是一个选项设置错误,在msvc上它是C / C ++,语言,“将wchar_t视为内置类型”。或者你有一个将字符串类型破解为unsigned short的宏。
答案 1 :(得分:0)
C ++允许函数重载,因此函数的参数记录在名称修改中。您可能尝试使用不同于DLL期望的参数类型来调用函数。
确保您的头文件与您的DLL版本匹配。