1.寫(xiě)一個(gè)C++的庫用來(lái)測試cpplib.h:
===================
class Add{
public:
int add(int a,int b);
};
cpplib.cpp:
================================
int Add::add(int a,int b){
return (a+b);
}
編譯:
cpplib:cpplib.cpp
g++ -o libcpplib.so cpplib.cpp -fPIC -shared
就可以生成一個(gè)測試庫libcpplib.so
2.增加用于C的接口:
寫(xiě)一個(gè)接口頭文件cpplib_interface.h
===================================
#ifdef __cplusplus
extern "C"
{
#endif
int add(int a,int b);
#ifdef __cplusplus
}
#endif
為了省時(shí)間,把實(shí)現寫(xiě)在cpplib.cpp中:
========================
#include "cpplib_interface.h"
int add(int a,int b){
Add x;
return x.add(a,b);
}
然后重新編譯生成libcpplib.so,現在這個(gè)函數提供了用于C的接口,使用nm看一下:
nm libcpplib.so | grep add
0000053c T _ZN3Add3addEii
00000549 T add
3.測試:
寫(xiě)一個(gè)main.c
===========================
#include
#include "cpplib_interface.h"
int main(int argc ,char*argv[]){
int a=10,b=7;
printf("10+7=%d\n",add(a,b));
return 0;
}
編譯:
gcc -o main main.c -L. -lcpplib
運行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/media/d/nfs/c_call_cpplib (這里是增加libcpplib.so庫所在的路徑到運行庫搜索路徑)
./main
運行結果:
10+7=17
總結:
在C++中使用extern “C“ 聲明的函數,會(huì )生成兩套接口,一個(gè)用于c++,一個(gè)用于C。
擴展:
有時(shí)候在C里面調用C++庫函數時(shí),也需要維護一個(gè)對像,這樣的話(huà)就需要引入一個(gè)機制。
使用id來(lái)管理類(lèi)對象
修改cpplib_interface.h
=============================
#ifdef __cplusplus
extern "C"
{
#endif
int create_obj();
void destroy_obj(int id);
int add(int id,int a,int b);
#ifdef __cplusplus
}
#endif
修改cpplib.cpp
==============================
#define OBJ_COUNT 128
struct obj_list_t{
unsigned int id;
Add *obj;
}obj_list[OBJ_COUNT];
int create_obj()
{
int i;
for (i=0;i
if (obj_list[i].id==0) {//free
break;
}
}
if (i==OBJ_COUNT) {
return -1;//error
}
obj_list[i].id=i+1;
obj_list[i].obj=new Add();
return obj_list[i].id;
}
void destroy_obj(int id)
{
int i;
for (i=0;i
if (obj_list[i].id==id) {//free
break;
}
}
if (i==OBJ_COUNT) {
return ;//error
}
obj_list[i].id=0;
delete obj_list[i].obj;
}
static Add* get_obj(int id)
{
int i;
for (i=0;i
if (obj_list[i].id==id) {//free
break;
}
}
if (i==OBJ_COUNT) {
return 0;//error
}
return obj_list[i].obj;
}
int add(int id,int a,int b){
Add* x=get_obj(id);
if (x!=0) {
return x->add(a, b);
}else{
return 0;
}
}
重新編譯生成庫
修改main.c
======================
int main(int argc ,char*argv[]){
int a=10,b=7;
int id=create_obj();
printf("id=%d 10+7=%d\n",id,add(id,a,b));
destroy_obj(id);
return 0;
}
運行結果如下:
id=1 10+7=17
總結:
使用id來(lái)映射類(lèi)的對象,就像很多SDK里面的句柄一樣。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。