靜態庫和動態庫的區別和使用

2021-09-22 20:17:00 字數 1302 閱讀 3613

靜態庫在編譯鏈結是就把庫里頭的**提取出來放到可執行檔案中,程式的執行不在依賴庫。

動態庫在編譯鏈結時只記錄要用的名字在哪個庫檔案中,執行時才從庫檔案中查詢這個名字(函式或著變數)並訪問它。

之間的區別:生成可執行檔案大小、可執行檔案執行速度、庫生效方式

(1)靜態庫 lib***.a

1)生成靜態庫

寫的c語言程式不應該有main函式

gcc -c  ***1.c

gcc -c  ***2.c

寫的頭函式***.h中存放函式的宣告和全域性變數的宣告(extent int a之類的)

ar -r lib***.a ***1.o  ***2.o

2)使用庫

寫c語言程式u***xx.c,包含***.h標頭檔案,那麼在程式中可以呼叫庫中的函式或者全域性變數。

方法一:gcc -c u***xx.c; gcc u***xx.o lib***.a 

方法二:gcc -c u***xx.c; gcc u***xx.o l*** -l. (其中l***表示lib庫lib***.a檔案,***表示庫名;-l.表示當前的目錄下查詢庫檔案lib***.a)

方法三:先設定全域性環境變數library_path為庫檔案所在的目錄,然後gcc -c u***xx.c; gcc u***xx.o l***

3)檢視靜態庫

ar -t lib***.a   //檢視靜態庫中鏈結的檔案

nm lib***.a  //檢視靜態庫中鏈結文集及其中的函式

(2)動態庫 lib***.so

1)生成動態庫

寫的c語言程式不應該有main函式

gcc -c -fpic ***1.c ***2.c;

gcc -shared -o lib***.so ***1.o ***2.o;

2)使用動態庫

編譯時:

寫c語言程式u***xx.c

方式一:gcc -c u***xx.c; gcc u***xx.o l*** -l. 

方式二:先設定全域性環境變數library_path為庫檔案所在的目錄,然後gcc -c u***xx.c; gcc u***xx.o l*** 

執行時:

方式一:把庫檔案放在系統標準庫目錄,/urs/lib或/lib目錄中,就可以執行可執行檔案了。

方法二:gcc -c u***xx.c; gcc u***xx.o l*** -l. (其中l***表示lib庫lib***.a檔案,***表示庫名;-l.表示當前的目錄下查詢庫檔案lib***.a)

方式三:先設定全域性環境變數ld_library_path為動態庫檔案所在的目錄,然後執行可執行檔案。 

靜態庫和動態庫的區別

windows vc 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的...

靜態庫和動態庫的區別

靜態庫在程式編譯時被連線到目標 中,程式執行時不再需要靜態庫 動態庫在編譯時並不被連線到目標 中,而是程式執行時才被載入,執行時仍然需要動態庫存在。靜態庫的命名規範是以 lib為字首,緊接著是靜態庫名,副檔名是.a 先將檔案編譯成 o 檔案然後是編譯成靜態檔案 動態庫檔案在檔名前加 lib字首,擴充...

靜態庫和動態庫的區別

庫的作用 庫是共享程式 的方式,一般分為靜態庫和動態庫。庫實現了某些特定的功能模組化。方便分享和使用!異同點 2.靜態庫和動態庫有什麼特點?不同點 靜態庫 鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。動態庫 鏈結時不複製,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,...