背景:接第三方的行情接口,使用第三方的so文件和demo,并且将第三方的so进一步封装进本方的动态链接库中(假设就叫CDHmarketApi.so 随便起的,如有雷同,纯属巧合),成为本方链接库的一个行情订阅功能模块;
遇到的一些问题:
这个问题表明是符号未定义的问题,而且直接定位于产品链接的第三方库中,因为没有这个第三方库的源码,给排查增加了难度。
错误定位:
这块可以通过ldd -r命令查看生成的so是否存在符号未定义的内容。
ldd -r libCDHMarketApi.so
发现果然有好几个缺失的函数符号,不只是图上的这一个函数符号;网上补充:如果想在Ubuntu等Linux宿主机上查看ARM交叉编译好的可执行程序和库文件的相关依赖关系,可以通过以下命令:
readelf -d xxx.so | grep NEEDED
知道函数符号错了之后,可以通过以下命令辅助查看 具体是自己哪个cpp封装的时候调用了这个函数:
(3) 使用 c++filt symbol(上面那个函数符号:_ZN2.....) 定位错误在那个C++文件中
知道是哪几个特定的函数后。要么直接询问提供提供库文件的第三方,要么用命令挨个库文件排查;比如我调用了第三方接口中含有15个库文件(我想骂人),用以下命名查找函数符号列表:
nm -D ./xxx/lib/第三方的某个库so.1 | grep _ZN2.....
找到了就把这个库文件加到自己的编译选项中,一般都是丢失了,如果都找不到就@第三方 ,询问是不是给少了库文件~;