前沿
最经在调用自己编写的动态库的时候出现了hidden symbol `_ZN2cv6imshowERKSsRKNS_11_InputArrayE 的问题,很明显这是使用了未定义的函数,由于动态库so是使用了opencv的静态链接。所以还是自己编写的动态库出了问题。而且是出在了cv::inshow的这个函数上。
问题查找
现在问题是解决了,解决方案很简单,就是在动态库so的源码中把对应的cv::inshow去掉,或者加上该函数所在的opencv_highgui库的静态链接,在这里我是直接去掉函数的调用的,毕竟,能少一个链接库就少一份风险。
但是问题没找到之前,还是一头雾水的,毕竟自己已经做了opencv的静态链接,于是一开始是从opencv的编译开始操作,发现经过不同的编译选项的编译后,问题依旧。因此得到的结论是opencv的编译时没有问题的,一切还是得从动态库的地方查起。
使用 c++filt symbol 定位错误在那个C++文件中
见下图,使用命令 ldd -r xxx.so进行链接状态和错误信息的查找,确实是发现了该隐藏符号的使用,并且也是属于未定义的状态。
使用 c++filt symbol 定位错误
通过上面的ldd -r xxx.so的结果中,使用c++filt 命令进行错误定位,见下图:
很明显,指向了cv::imshow这个函数,到这里,就应该知道是什么原因了,肯定是在编写动态库的过程中用了该函数并没有链接对应的库。去掉该函数的调用或者将对应的库链接进来就可以了。修改过后再次使用ldd -r xxx.so查看依赖情况,发现原来的未定义符号已经解决。