庫(動態庫和靜態庫)

2021-10-25 10:21:43 字數 2281 閱讀 7310

如有問題,請多多指教。

庫:預先編譯好的方法的集合

分為 靜態庫 (libxx.a)和 動態庫 (libxx.so)   (xx是庫名)

我們在linux系統下,我們要知道這幾個存放位置:

可執行的程式,命令放在 /bin /usr/bin

標頭檔案放在  /usr/include

庫檔案放在 /lib    /usr/lib  

1.那麼庫有什麼作用呢?

簡單來說,當我們要執行乙個重複而又相同的功能的時候,我們就可以將這個功能封裝到乙個庫裡面,然後我們就在需要的時候去使用它即可。

2.靜態庫:

1)靜態庫的生成:我們準備兩檔案,main.c  和 add.c

將我們需要的檔案編譯生成 .o檔案。

gcc -c add.c

2) :

對生成的

.o目標檔案打包生成靜態庫

ar crv libfoo.a add.o       

是庫的名字

ar:做庫的命令 c:

建立庫

r:將方法新增到庫里 v

:顯示過程,可以不要 3

使用靜態庫

gcc -o main main.c (-l .) -lfoo

-l 是我們使用的位置,

.就是當前的位置。

-l 是我們使用的庫

foo

就是庫名

如上圖演示,我們就是在生成了乙個靜態庫和使用了乙個靜態庫。

這時候我們需要思考一下,現在我們就剛才生成的靜態庫刪除掉,這時候我們的程式還可以繼續執行嗎?

動態庫: 1

)將所有的

.c檔案編譯成

.o目標檔案

gcc -c add.c

2) 對生成的

.o檔案處理生成共享庫,假設共享庫的名字為

libfoo.so

gcc -shared -fpic -o libfoo.so add.o max.o 引數

-shared

表示輸出結果是共享庫型別的

-fpic

表示使用位址無關**(

position independent code

)技術來生產輸出檔案 3

)庫的使用

上圖就是動態庫的使用方法,但是有一處不一樣的就是,當我們編譯好,檔案後,不能執行是為什麼呢?(可以和靜態庫的一起思考)

補充一下:

ldd+main(

可執行檔案

),檢視可執行檔案使用的檔案

4.靜態庫和共享庫的區別:

靜態庫優勢:

靜態庫相當於複製乙份庫檔案到專案**中,不需要像動態庫那樣需要有動態載入,識別依賴函式位址的開銷。

缺點:

增加應用程式可執行檔案的大小,因為它不能僅僅提取僅僅依賴的庫函式到應用程式中。

庫檔案的更新不會反映到應用程式中,除非應用程式重新編譯新的靜態庫。

共享庫的優點:

相對於靜態庫,共享庫能夠在任何時候更新(修復

bug,

增加新的功能),並且能夠被反映到應用程式中。

顯著減少應用程式可執行檔案占用的硬碟空間。

缺點:

使應用程式在不同平台上移植變得更複雜,因為它需要為每每個不同的平台提供相應平台的共享庫。

對於上面的那個問題來說,在靜態庫的使用中,我們已經編譯好這個程式了,靜態庫已經載入進去了,因此我們刪除了這個靜態庫也不會影響到我們程式的使用。當我們使用動態庫的時候,我們需要在執行時間將庫載入進去,因此我們需要在使用的時候,需要載入我們的庫。

動態庫和靜態庫

本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...

動態庫和靜態庫

先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知...

動態庫和靜態庫

簡單的說,使用動態庫就是在鏈結的時候,不會將動態庫的 鏈結到可執行檔案中,而是採用symbol的方式。使用靜態庫,生成可執行檔案的時候,會將靜態庫的 鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。靜態庫 就是多個目標檔...