C调用C++接口,这个问题的解决和C++调用C动态链接库是类似的。话不多说,直接上例子来进行说明。
helloworld_cpp.h文件
1#include<iostream> 2using namespace std; 3 4class CHello 5{ 6private: 7 8public: 9 CHello(); 10 ~CHello(); 11 12 void Print_HelloWorld(); 13};
helloworld_cpp.cpp文件
1#include "helloworld_cpp.h" 2 3void CHello::Print_HelloWorld() 4{ 5 cout << "Hello World!" << endl; 6} 7 8CHello::CHello() 9{ 10} 11 12CHello::~CHello() 13{ 14}
到这里,我们实际实现的内容都以及全部完成了。现在我们需要做一些改变以使得C能够调用到C++接口。下面我们再写个接口文件。
helloworld_interface.h文件,该文件提供给C语言使用,使得C语言能够调用C++的接口。需要调用该接口的代码,就需要包含此文件,例如下面的mian.c文件就包含了该文件。
1#ifndef HELLOWORLD_INTERFACE_H 2#define HELLOWORLD_INTERFACE_H 3 4#ifdef __cplusplus 5extern "C"{ 6#endif 7 8void Print_HelloWorld(); 9 10#ifdef __cplusplus 11} 12#endif 13 14#endif //HELLOWORLD_INTERFACE_H
helloworld_interface.cpp文件,这个文件将C++的接口变成了C语言可以调用的接口。在这个文件中需要包含helloworld_cpp.h文件,因为它需要使用CHello这个类。但是不能在helloworld_interface.h文件包含,因为C语言需要包含helloworld_interface.h文件,否则会导致编译不过去。
1#include "helloworld_interface.h" 2#include "helloworld_cpp.h" 3 4static CHello g_interface; 5 6void Print_HelloWorld() 7{ 8 g_interface.Print_HelloWorld(); 9}
至此,我们的C++文件就写完了,将其编译为动态链接库。使用的命令如下:
g++ -shared -fPIC helloworld_cpp.cpp helloworld_interface.cpp -o libhelloworld_cpp.so
编译之后,生成名为libhelloworld_cpp.so的动态链接库。将其拷贝一份到/usr/lib目录之下。
我们编译main.c文件来调用C++接口,其内容如下。
1#include "helloworld_interface.h" 2 3int main() 4{ 5 6 Print_HelloWorld(); 7 8 return 0; 9}
编译main.c文件,命令如下:
gcc main.c -o main -L. -lhelloworld_cpp
./main执行main,输出如下所示:

本文同步分享在 博客“zy010101”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。