C 模块调用C++ 编写模块

           C 模块调用 C++ 编写模块

 

涉及知识点

1:

#ifdef  __cplusplus

extern "C"

{

#endif

注意: 不要写成   ifndef

    这样的代码到底是什么意思呢?首先,__cpluspluscpp 中的自定义宏,那么定义了这个宏的话表示这是一段cpp 的代码,也就是说,上面的代码的含义是: 如果这是一段cpp 的代码,那么加入extern "C"{} 处理其中的代码。

  要明白为何使用extern "C" ,还得从cpp 中对函数的重载处理开始说起。在c++ 中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返 回类型等等. 而在C 中,只是简单的函数名字而已,不会加入其他的信息. 也就是说:C++C 对产生的函数名字的处理是不一样的. 目的就是主要实现CC++ 的相互调用问题。

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

 

你可能感兴趣的:(C++,c,Path,library,interface,编译器)