如有問題,請多多指教。
庫:預先編譯好的方法的集合
分為 靜態庫 (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的方式。使用靜態庫,生成可執行檔案的時候,會將靜態庫的 鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。靜態庫 就是多個目標檔...