c 模块调用c++ 编写模块...
时间:2010-08-10 来源:aobai219
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