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