C調用C++函數庫

C調用C++函數庫,通常不能直接調用,須要將C++庫轉換成C接口輸出,方能夠使用C調用,看下面的例子:  linux

  
  
  
  
  
aa.h #include <iostream> #include <string> using namespace std; class sample { public: int method(); };

  
  
  
  
  
aa.cpp #include "aa.h" int sample::method() { cout<<"method is called!\n"; }


將上面的兩個文件生成動態庫libaa.so放到 /usr/lib目錄下,編譯命令以下  ios

  
  
  
  
  
g++ -fpic -shared -o /usr/lib/libaa.so aa.cpp -I ./

因爲在C中不能識別類,因此要將上面類的成員函數封裝成C接口函數輸出,下面進行封裝,將輸出接口轉換成C接口。  函數

  
  
  
  
  
mylib.h #ifdef _cplusplus extern "C" { #endif int myfunc(); #ifdef _cplusplus } #endif
   
   
   
   
   
mylib.cpp #include "aa.h" #ifndef _cplusplus #define _cplusplus #include "mylib.h" #endif int myfunc() { sample ss; ss.method(); return 0; }


在linux下,gcc編譯器並沒用變量_cplusplus來區分是C代碼仍是C++代碼,若是使用gcc編譯器,這裏咱們能夠本身定義一個變量_cplusplus用於區分C和C++代碼,因此在mylib.cxx中定義了一個變量_cplusplus用於識別是否須要「extern "C"」將函數接口封裝成C接口。可是若是使用g++編譯器則不須要專門定義_cplusplus,編譯命令以下:  spa

gcc -shared -o mylib.so mylib.cpp -L. -laa  code

  
  
  
  
  
main.c #include <stdio.h>#include <dlfcn.h>int main(void) { int (*dlfunc)(); void *handle; //定義一個句柄 handle = dlopen("./mylib.so", RTLD_LAZY);//得到庫句柄 dlfunc = dlsym(handle, "myfunc"); //得到函數入口 (*dlfunc)(); dlclose(handle); return 0; }

編譯命令以下:  接口

gcc -o main main.c ./mylib.so -ldl get

 



相關文章
相關標籤/搜索