2014-11-01 10:39
3人閱讀收藏
編輯 刪除2013-06-08 20:52:48
| 分類:
整合開發環境相關|舉報
|字型大小訂閱
linux下的靜態鏈結庫,做起來比較容易,只要將目標檔案用ar打包就可以,下面寫一下動態鏈結庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請大家指正。
動態鏈結庫的生成:
**上與寫靜態鏈結庫沒什麼區別,主要是在編譯時,以兩個檔案舉例:
/*mylib.h
*/void
print();
/*mylib.c
*/#include
<
stdio.h
>
#include
"mylib.h
"void
print()
編譯方法如下:
gcc -fpic -shared mylib.c -o mylib.so
此時將生成mylib.so動態鏈結庫檔案。
動態鏈結庫在使用時,分為「隱式呼叫」和「顯式呼叫」兩種。
如果是隱式呼叫,則與靜態庫的使用方法差不多,注意需要包含匯出函式的標頭檔案,即mylib.h:
#include
<
stdio.h
>
#include
"mylib.h
"int
main()
編譯方法:
gcc -o main main.c -l./ mylib.so
注意要加上動態鏈結庫的搜尋路徑,否則編譯器只會到系統路徑中去尋找。
顯式呼叫的方式,不必包含mylib.h,但是需要增加幾個系統呼叫:
#include
<
stdio.h
>
#include
<
dlfcn.h
>
//顯式載入需要用到的標頭檔案
intmain()
void(*
print)()
=dlsym(pdlhandle,
");
//定位動態鏈結庫中的函式
if(
!print )
print();
//呼叫動態鏈結庫中的函式
dlclose(pdlhandle);
//系統動態鏈結庫引用數減1
return0;
}
另外cpp的庫在使用這種方式時要用extern 「c」宣告下,
對於cpp,類可以在函式中作為區域性物件呼叫,如果想使用庫中宣告的類,則要以返回值的形式來產生了。
看一下顯式呼叫的編譯方式:
gcc -ldl -o main main.c
注意要新增-ldl選項,以使用顯式呼叫相關的函式呼叫。
Linux下動態鏈結庫和靜態鏈結庫
第一部分 編譯過程 預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc e表示進行預處理。編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc s表示進行編譯。彙編,是將彙編 轉換為機器可執行指令的過程。通過使用gcc c或者as...
呼叫靜態鏈結庫和動態鏈結庫
呼叫靜態鏈結庫 靜態鏈結庫由.h和.lib檔案組成,h檔案在工程中用來宣告,而.lib檔案包含供外界呼叫的函式的原型。vc 6.0中呼叫靜態鏈結庫.lib共3種方法 1.首先使用語句 include lib.h 並將lib.h拷貝到當前工程目錄下 接著對staticlib smp.lib使用語句 p...
Linux下c 通過動態鏈結庫呼叫類
我的程式是乙個類,在網上找了半天,都是c的例子,c 的類封裝成靜態庫倒容易,可是如何封裝成動態庫,在其它程式中呼叫呢?linux下的動態鏈結庫叫so,即shared object,共享物件。一些函式就不說了,網上多的是。把我遇到的問題寫下來吧 提示錯誤 undefined reference to ...