回覆列表
  • 1 # 加油人生

    C一般不能直接呼叫C++函式庫,需要將C++庫封裝成C介面後,才可以使用C呼叫。  下面舉例,說明一個封裝策略: //code in add.cxx #include "add.h"int sample::method(){ cout<<"method is called!\n";}//code in add.h #include using namespace std;class sample{ public: int method();};  將上面的兩個檔案生成動態庫libadd.so放到 /usr/lib目錄下,編譯命令如下:  sudo g++ -fpic -shared -g -o /usr/lib/libadd.so add.cxx -I ./  由於在C中不能識別類,所以要將上面類的成員函式,要封裝成C介面函式才能被呼叫。下面進行封裝,將輸出介面轉換成C介面。//code in mylib.cxx#include "add.h"#ifndef _cplusplus#define _cplusplus#include "mylib.h"#endifint myfunc(){ sample ss; ss.method(); return 0;}//code in mylib.h #ifdef _cplusplusextern "C"{#endifint myfunc();#ifdef _cplusplus}#endif  在linux下,gcc編譯器並沒用變數_cplusplus來區分是C程式碼還是C++ 程式碼(沒有宏定義),如果使用gcc編譯器,這裡我們可以自己定義一個變數_cplusplus用於區分C和C++程式碼,所以在mylib.cxx中定義 了一個變數_cplusplus用於識別是否需要“extern "C"”將函式介面封裝成C介面。但是如果使用g++編譯器則不需要專門定義_cplusplus,編譯命令如下:  g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I ./main.c #include #include #include "mylib.h"int main(){ 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  下面就可以執行了。  需要說明的是,由於main.c 和 mylib.cxx都需要包含mylib.h,並且要將函式myfunc封裝成C介面函式輸出需要“extern "C"”,而C又不識別“extern "C"”,所以需要定義_cplusplus來區別處理mylib.h中的函式myfunc。  在main.c的main函式中直接呼叫myfunc()函式也能執行,這裡介紹的是常規呼叫庫函式的方法。

  • 中秋節和大豐收的關聯?
  • 內熱重經常發熱頭暈頭昏?