C呼叫C++靜態庫的方法
遠比想象中的簡單,其實就是兩點:
1.為C++風格的介面做一個wrapper,利用extern “C”。
2.編譯選項中加上-lstdc++
比如說有一個庫是這樣的:
ClassA.h:
[c]
class A {
private:
int x;
public:
A(int _x);
int getResult(int ax);
};
[/c]
編譯成ClassA.o,然後打包成libClassA.a
為了能用c呼叫這libClassA,需要對它作一個Wrapper:
CClassA.h
[c]
#ifdef __cplusplus
extern “C” {
#endif
int A_init(int);
int A_getResult(int);
#ifdef __cplusplus
}
#endif
[/c]
需要注意的是,CClassA.h裡,不能include C++的標頭檔案,你知道的……
CClassA.c裡面,wrapper函式的實現:
[c]
#include “ClassA.h”
A * a = NULL;
int A_init(int _x)
{
a = new A(_x);
}
int A_getResult(int ax)
{
return a->getResult(ax);
}
[/c]
然後用g++將CClassA編譯成CClassA.o
現在有一個c程式想呼叫這個ClassA的方法,就這樣做:
CInvoker.c
[c]
#include
#include “CClassA.h”
int main()
{
A_init(1);
printf(“%dn”, A_getResult(100));
}
[/c]
編譯指令為(在redhat linux下):
g++ CInvoker.c CClassA.o -L./ -lClassA -lstdc++