嵌入式开发——用C语言调用C++的动态库时函数指针为空
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式开发——用C语言调用C++的动态库时函数指针为空相关的知识,希望对你有一定的参考价值。
问题描述
在工作中有一次定制项目,需要用在我们的嵌入式设备里集成客户的算法,我是负责将客户提供的算法SDK给集成到设备里。当我用C语言把调用算法的代码都写好并打包升级到设备里运行时,程序直接崩掉。查明原因是函数指针为空,我确认了动态库是成功加载的,那还找不到函数,我就怀疑是客户给的动态库有问题,会不会头文件和动态库对应不上,动态库里根本没有这个名字的函数。于是我用nm命令去查看动态库的符号,果然找不到头文件里声名的函数。我将问题反馈给对方,对方的研发人员也很蒙,对方说他都验证过才提供的动态库,函数调用有问题可以理解,找不到函数名就离谱。
解决方法
我仔细去排查,发现虽然找不到完全一样的函数名,但是有类似的函数名,假设头文件里声名了text()函数,会在动态库找到一个xxxtextxxx的函数名,函数名的前面和后面多出来一些,不完全一致,并且每个函数都可以找到类似的函数名。我觉得这肯定不是巧合,就去请教了公司负责算法开发的大佬,才知道这是因为对方是用C++写的程序,但是没有用exter “C”{ }括起来,导致不兼容C语言,所以我用C语言去调用会找不到函数。于是我将问题反馈给客户那边,对方将C++代码添加上exter “C”{ }再重新编译就可以了。
补充
对nm命令和**exter “C”{ }**不熟悉的可以看博客:《#ifdef __cplusplus extern “C“{ #endif的作用》和《查看静态库(.a)、可执行文件(.out、.o)里的符号信息–nm命令》。
以上是关于嵌入式开发——用C语言调用C++的动态库时函数指针为空的主要内容,如果未能解决你的问题,请参考以下文章