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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容