2015年10月7日 星期三

將C++的function包裝成Library(so檔)給C的程式使用

今天要練習的是,把C++的Function包給C程式使用時該怎麼作

首先我們先撰寫一支簡單的C++程式,如下所示
////////////////////  cplus_lib.cpp  ////////////////////////
#include <iostream>
using std::cout;

void cout_func()
{
cout << "Hello World!\n";
}
//////////////////////////////////////////////////////////////////

接著我們將她打包成動態連結檔libcplus_lib.so,步驟如下:
1. gcc -Wall -O2 -c -o cplus_lib.o cplus_lib.cpp
2. gcc -shared -o libcplus_lib.so cplus_lib.o

經過以上兩個步驟,我們可以得到動態連結檔的函式庫 libcplus_lib.so






接著我們試著再寫一支C程式,此程式去使用函式庫的cout_func()來印出"Hello World"
///////////////////////  main_cout.c  //////////////////////////////
#include <stdio.h>

int main()
{
        cout_func();
        return 0;
}
/////////////////////////////////////////////////////////////////////////////

接著編譯過程如下,注意要額外指定C++ 標準函式庫 libstdc++:
1.gcc -o main_cout_dynamic main_cout.c -L. -lcplus_lib -lstdc++

結果會出下以下的錯誤訊息:












解決方法,要在產生library的程式當中加入一些東西,如下所示:
////////////////////  cplus_lib.cpp  ////////////////////////
#include <iostream>
using std::cout;

#ifdef __cplusplus
extern "C" {
#endif
void cout_func()
{
cout << "Hello World!\n";
}
#ifdef __cplusplus
}
#endif
//////////////////////////////////////////////////////////////////
註:上面程式碼的意思是: 如果這是一段cpp的程式碼,就加入extern "C"{} 來處理其中的程式碼


這樣子編譯器才看得懂,所以再整個重新編譯一次,就成功了!
















註: 上圖第三行,作者把產生出來的library複製到library環境變數的預設路徑下,如果不這樣作,當執行main_cout_dymanic時,會出現找不到library的錯誤訊息,關於這部分作者正在尋找可以自己指定吃特定路徑的library的方法.....

如果有朋友知道方法,也請給予指教,謝謝!

2 則留言:

  1. # 把產生出來的lib對應路徑 export 出來 例如 /home/abc/
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/abc/
    # 查看路徑內容 是否有顯示路徑 在執行一次 應該就可以了
    echo $LD_LIBRARY_PATH

    回覆刪除
    回覆
    1. Hi: 感謝你的回覆,真的是加入LD_LIBRARY_PATH的環境變數就可以work了!!

      刪除