5

我在将 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 文件包含不同的签名。

代码包括正确的头文件和名称仍然不正确的库。

任何帮助,将不胜感激。

4

2 回答 2

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 视为内置类型”。或者你有一个宏可以将字符串类型破解为无符号短。

于 2012-09-28T13:07:30.857 回答
0

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

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

于 2012-09-28T13:12:13.953 回答