现在的位置: 首页 > 综合 > 正文

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

2013年10月21日 ⁄ 综合 ⁄ 共 1175字 ⁄ 字号 评论关闭



          

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

 

抱歉!评论已关闭.