Undefined symbols for architecture arm64:: non-virtual thunk to XXX:XXX

    non-virtual thunk to PLT_DeviceHost::OnSsdpPacket(NPT_HttpRequest const&, NPT_HttpRequestContext const&)", referenced from vtable for PLT_MediaRendererMy in DlnaRender.o


问题: DLNA Platinum库生成过程中,生成的库放到别人项目中发现链接失败,找不到两个函数;

在库生成工程中确认是有生成对应的库的,于是问题卡住.同类型找不到的可以参考一下;通过该问题主要是掌握分析是否函数有生成,生成的库及调用端的指针是否一致;

解决办法:

一.参考附1,知道可以对生成的链接文件查看链接表,也可对出现问题的.o文件查看链接信息,于是打开观看,只以其中一个为例子:

二.操作:

2.1于FRAMEWORK中,需要先进入对应的framework目录:nm -A Platinum -arch arm64

查看有:

__ZThn424_N14PLT_DeviceHost12OnSsdpPacketERK15NPT_HttpRequestRK22NPT_HttpRequestContext

结果:发现该函数偏移指针为424;

2.2 对调用的函数:nm -a DlnaRender.o;

位置在:/Users/oumin/Library/Developer/Xcode/DerivedData/DLNASample-bltcpxohaknyozhdqprwltsfkzxz/Build/Intermediates.noindex/DLNASample.build/Debug-iphoneos/DLNASample.build/Objects-normal/arm64,

相关生成文件的位置,可以在XCODE工作中,点击生成的文件按上键,向上一层目录找XXX.build里面就是了.

查看有:

__ZThn408_N14PLT_DeviceHost12OnSsdpPacketERK15NPT_HttpRequestRK22NPT_HttpRequestContext

结果:发现偏移位置为408.

三分析:

从2.1,2.2的结果可以发现偏移植不同,这是引起的原因,从附1的解决方法中,认为是DEFINE引起的,经尝试并无效果,最终定位为其中这个函数的头文件是在另一个库中的Neptune,经查看,果然头文件已有变化,同步替换该库,问题解决.

四.总结:

这次问题主要原因是没有同步更新依赖库引起,不过也掌握了分析C++链接可能出现问题的判断,可以供当引入C++库时出现找不到引用时的方法参考.

参考:

附1:https://zhuanlan.zhihu.com/p/27121990

附2:http://www.360doc.com/content/16/0922/22/11764545_592896005.shtml

附3:https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling

你可能感兴趣的:(Undefined symbols for architecture arm64:: non-virtual thunk to XXX:XXX)