1. 程式人生 > >C呼叫C++靜態庫的方法

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++