C
模块调用
C++
编写模块
涉及知识点
1:
#ifdef
__cplusplus
extern "C"
{
#endif
注意:
不要写成
ifndef
这样的代码到底是什么意思呢?首先,__cplusplus
是cpp
中的自定义宏,那么定义了这个宏的话表示这是一段cpp
的代码,也就是说,上面的代码的含义是:
如果这是一段cpp
的代码,那么加入extern "C"{
和}
处理其中的代码。
要明白为何使用extern "C"
,还得从cpp
中对函数的重载处理开始说起。在c++
中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返 回类型等等.
而在C
中,只是简单的函数名字而已,不会加入其他的信息.
也就是说:C++
和C
对产生的函数名字的处理是不一样的.
目的就是主要实现C
与C++
的相互调用问题。
2
:
头文件以及
.cpp
文件。
在
C++
中,
包含了头文件,就可以调用对应的
.cpp
文件中的函数,
前途是在对应的
.cpp
文件中包含该头文件。
最近项目中所犯得错误,
一个模块用
c++
写的
,
想要在
c
中调用该
c++
模块
,所以提供了一个头文件(
interface.h, interface.cpp
),
在头文件中用
(interface.h)
#ifdef
__cplusplus
extern "C"
{
#endif
等做了处理,
并且将该
C++
模块编译成了一个库,在调用的时候怎么都找不到函数定义。
最后发现提供的接口是包含了
extern
“
C
”
,在
interface.cpp
文件中却没有包含头文件
interface.h
,
将该
C++
模块编译成动态库的时候是能够编译成功,
但是在外界
C
模块调用的时候却发现找不到
interface
中提供的接口函数。
原因就是没有在
interface.cpp
中加
interface.h
,
所以在头文件中是按照
C
编译器编译的,但是在
interface.cpp
中是按照
c++
编译的。当然找不到了,
还有另外的一种防止错误,
在
interface.cpp
中添加
#ifdef
__cplusplus
extern "C"
{
#endif
这样,即使忘记添加
interface.h
头文件,
同样可以成功编译。
3
:动态库的调用
在板子上面经常看见
*.so
unloaded
等错误提示。
通常情况是提供的动态库路径没有添加到
LD_LIBRARY_PATH
环境变量中去,
所以要调用
Export LD_LIBRARY_PATH=
$LD_LIBRARY_PATH:/lib/path
当然还有其他添加库路径的方法。
4
:
还有其他方法。
参考
http://bbs.chinaunix.net/thread-1764196-1-2.html
参考
http://blog.chinaunix.net/u/22630/showart_496636.html