首先我們先撰寫一支簡單的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的方法.....
如果有朋友知道方法,也請給予指教,謝謝!
# 把產生出來的lib對應路徑 export 出來 例如 /home/abc/
回覆刪除export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/abc/
# 查看路徑內容 是否有顯示路徑 在執行一次 應該就可以了
echo $LD_LIBRARY_PATH
Hi: 感謝你的回覆,真的是加入LD_LIBRARY_PATH的環境變數就可以work了!!
刪除