庫是在鏈結階段和相應的.o檔案生成可執行檔案,根據鏈結方式的不同,可以分為靜態庫與動態庫。
當使用靜態庫時,聯結器會找出程式所需的函式,將它們複製到執行檔案中,因為是完整複製,所以一旦鏈結成功,可執行檔案在靜態庫不存在的情況下依然可以執行。
動態庫與靜態庫不同,動態庫會在程式內留下乙個 標記,當程式執行時,指明必須載入的庫檔案,所以當執行檔案時才動態載入庫檔案,使用動態庫必然會節約空間。
在linux下進行鏈結首先會鏈結動態庫,也就是如果不特別指定,會預設鏈結動態庫。
靜態庫的建立
1.先建立並編輯bank.h與sort.c檔案,bank.h內容如下:
程式sort.c提供了函式sortaz,功能是對程式進行排序:
2.將sort.c檔案生產可執行的sort.o檔案
指令:gcc -c sort.c
3.建立靜態庫並將目標檔案加入庫中
指令:ar -r 目標庫檔名稱 目標檔名稱
其中,ar是建立靜態庫的命令,選項-r是將目標檔案加入到靜態庫中,目標庫檔名有個不成文的規定,一般用lib開頭,以.a結尾,目標檔案列表中的目標檔案之間用空格隔開。
例如:ar -r libstring.a filel.o file2.o file3.o
ar指令的選項主要由一下幾種:
[r]:將目標檔案加入到靜態庫
[t]:顯示今天庫中的檔案
[a]:將目標檔案追加到靜態庫檔案現有檔案之後
[b]:將目標檔案追加到靜態庫檔案現有檔案之前
[d]:從指定的今天庫中刪除指定檔案
[x]:從指定的靜態庫中提取目標檔案
[p]:把靜態庫檔案中指定的檔案輸出到標準裝置
[q]:快速的追加檔案到靜態庫
Linux複習之靜態庫與動態庫的區別
靜態庫在程式編譯時會被鏈結到目標檔案中,程式執行時不需要該庫。缺點是編譯後檔案較大,但是隔離性好。動態庫在編譯時不會被鏈結到目標 中,在程式執行時才被載入,所以程式執行時需要動態庫存在。優點是編譯後檔案較小,多個應用程式可以使用同乙個動態庫,啟動多個程式時,只需要將動態庫載入到記憶體一次。通過之前的...
linux靜態庫的建立
ar crv libfoo.a bill.o fred.o bill.o 由gcc c bill.c 得到 fred.o 由gcc c fred.c得到 具體過程如下 bill.c 程式如下 include void bill char arg fred.c程式如下 include void fre...
Linux建立靜態庫
1 gcc c joker.c mac.c 建立.o檔案,已編譯,未鏈結的檔案。2 ar crv libfoo.a joker.o mac.o 對.o檔案歸檔,把一組小的檔案集中到乙個大檔案中,使用ar可以把任何型別的檔案歸為檔案。3 ranlib libfoo.a 為這個庫建立乙個內容表。可以這樣...