文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>c 模块调用c++ 编写模块...

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

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载