由于名称修饰引起的未解决外部符号问题

5

我在将XERCES从2.6升级到2.8时,遇到了链接错误。

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

我查看了xerces-c_2.8.lib文件,并发现其名称与我的.obj文件中的有些不同,如下所示:
?resolveEntity@HandlerBase@xercesc_2_8@@UAEPAVInputSource@2@QB_W0@Z

我理解链接器无法找到匹配项并抛出错误。

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

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

任何帮助都将不胜感激。


你使用的是哪个平台和编译器? - ThePosey
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 视为内置类型"。或者您有一个宏来将字符串类型修改为 unsigned short。


很棒的分析。我不知道undname的存在。如果您知道MSVC保存其wchar_t配置的位置,我会额外点赞的。 - Phil H
抱歉,我的意思是感谢你告诉我它在哪里,如果可以的话,我会点赞多次。不用担心,我有新鲜的咖啡,我们得救了。 - Phil H
非常感谢您提供的宝贵意见,特别是对于undname.exe。XERCES vcproj已设置TreatWChar_tAsBuiltInType为true,我相应地更改了我的vcproj,一切都运行良好.. :) - NoName
真是太棒了的答案。这刚刚为我解决了(或者至少向前迈进了)一个类似的问题。Dern _ptr64和cdecl vs thiscall...我不能在头文件中强制你吗?!extern "C"啊,我是多么爱你。如果我开始一个赏金只是为了奖励这个答案,这是不是一种礼仪呢? - user645280

0

C++允许函数重载,因此函数的参数被记录在名称修饰中。你可能试图使用与DLL期望的不同参数类型调用该函数。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接