嵌入式开发——用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++的动态库时函数指针为空的主要内容,如果未能解决你的问题,请参考以下文章

C#调用带参动态库时一直报错?

C++零基础教程

c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法

嵌入式开发中常见3个的C语言技巧

C#总结调用C++动态库

[ZT]C++ 扩展和嵌入 Python