远比想象中的简单,其实就是两点:1.为C++风格的接口做一个wrapper,利用extern “C”。2.编译选项中加上-lstdc++
比如说有一个库是这样的:
ClassA.h:
class A {
private:
int x;
public:
A(int _x);
getResult(int ax);
};
编译成ClassA.o,然后打包成libClassA.a
为了能用c调用这libClassA,需要对它作一个Wrapper:
CClassA.h
#ifdef __cplusplus
extern "C" {
#endif
int A_init(int);
int A_getResult(int);
#ifdef __cplusplus
}
#endif
需要注意的是,CClassA.h里,不能include C++的头文件,你知道的……
CClassA.c里面,wrapper函数的实现:
#include "ClassA.h"
A * a = NULL;
int A_init(int _x)
{
a = new A(_x);
}
int A_getResult(int ax)
{
return a->getResult(ax);
}
然后用g++将CClassA编译成CClassA.o
现在有一个c程序想调用这个ClassA的方法,就这样做:
CInvoker.c
#include <stdio.h>
#include "CClassA.h"
int main()
{
A_init(1);
printf("%d\n", A_getResult(100));
}
编译指令为:
g++ CInvoker.c CClassA.o -L./ -lClassA -lstdc++

