c++ - 由于名称修改导致无法解析的外部符号

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

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

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用 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。

关于c++ - 由于名称修改导致无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12640139/

相关文章:

c++ - C++中的名称修饰或名称修饰

c++ - 在 Qt (C++) 中使用第三方库 (libconfig)

c++ - 是否可以显式调用名称损坏函数?

c++ - 为什么 C/C++ 代码可在不同的编译器上编译很重要?

c++ - 如何删除一组 vector 中的 vector 元素?

c++ - 链接器提示 vtable 上的 undefined reference

build - 谷歌 V8 构建错误 LNK1104 : cannot open file 'ws2_32.lib'

c++ - 如何在头文件中保留一个常量定义,而不是将它链接到每个库中?

c++ - 在 C++ 中将一天中的小时数和星期几转换为日期时间

c++ - OpenGL 文本忽略转义序列