linux c 如何調用c++

原文來源:如有侵權,請聯繫我。


C調用C++函數庫,一般不能直接調用,需要將C++庫轉換成C接口輸出,方可以使用C調用,看下面的例子:
文件add.cpp

  1. //code in add.cpp
  2. #include "add.h"
  3. int sample::add(int a, int b)
  4. {
  5.     cout<<"sample::add() is called!\n";
  6.     return (a+b);
  7. }
文件add.h
  1. //code in add.h
  2. #include <iostream>

  3. using namespace std;
  4. class sample
  5. {
  6.     public:
  7.         int add(int a, int b); 
  8. };
將上面的兩個文件生成動態庫libaa.so放到 /usr/lib目錄下,編譯命令如下:
  1. sudo g++ -fpic -shared --/usr/lib/libadd.so add.cpp -./
由於在C中不能識別類,所以要將上面類的成員函數封裝成C接口函數輸出,下面進行封裝,將輸出接口轉換成C接口。
文件mylib.cpp
  1. //code in mylib.cpp
  2. #include "add.h"
  3. #ifndef _cplusplus
  4. #define _cplusplus
  5. #include "mylib.h"
  6. #endif

  7. int myfunc(int a, int b)
  8. {
  9.     sample ss; 
  10.     return ss.add(a, b); 
  11. }
文件mylib.h
  1. //code in mylib.h
  2. #ifdef _cplusplus
  3. extern "C" 
  4. {
  5. #endif
  6.     int myfunc(int a, int b); 
  7. #ifdef _cplusplus
  8. }
  9. #endif
在linux下,gcc編譯器並沒用變量_cplusplus來區分是C代碼還是C++代碼,如果使用gcc編譯器,這裏我們可以自己定義一個變量 _cplusplus用於區分C和C++代碼,所以在mylib.cpp中定義了一個變量_cplusplus用於識別是否需要“extern "C"”將函數接口封裝成C接口。但是如果使用g++編譯器則不需要專門定義_cplusplus,編譯命令如下:
  1. g++ -fpic -shared --o mylib.so mylib.cpp -ladd -./
文件main.c
  1. //code in main.c
  2. #include <stdio.h>
  3. #include <dlfcn.h>
  4. #include "mylib.h"
  5. int
  6. main()
  7. {
  8.     int x = 3, y = 5, z;
  9.     int (*dlfunc)();
  10.     void *handle; //定義一個句柄
  11.     handle = dlopen("./mylib.so", RTLD_LAZY); //獲得庫句柄
  12.     dlfunc = dlsym(handle, "myfunc");//獲得函數入口
  13.     z = (*dlfunc)(x, y);
  14.     printf("z = x + y = %d\n", z);
  15.     dlclose(handle);
  16.     return 0;
  17. }
編譯命令如下:
  1. gcc -o main main../mylib.so -ldl
下面就可以執行了:
  1. ./main
執行結果:
  1. sample::add() is 
  1. = x + y = 8

需要說明的是,由於main.c 和 mylib.cpp都需要包含mylib.h,並且要將函數myfunc封裝成C接口函數輸出需要“extern "C"”,而C又不識別“extern "C"”,所以需要定義_cplusplus來區別處理mylib.h中的函數myfunc。

在main.c的main函數中直接調用myfunc()函數也能執行,這裏介紹的是常規調用庫函數的方法。



發佈了11 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章