调用自己编写的动态库出现hidden symbol `_ZN2cv6imshowERKSsRKNS_11_InputArrayE的原因与解决方法

文章讲述了在使用自定义动态库时遇到cv::imshow函数未定义的问题,通过检查链接状态、编译选项和c++filt工具定位到cv::imshow函数缺失对应库,最终解决方法是移除函数调用或添加opencv_highgui库的静态链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前沿

最经在调用自己编写的动态库的时候出现了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查看依赖情况,发现原来的未定义符号已经解决。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值