1.什麼是庫
庫是一種可執行代碼的二進制形式,可以直接被操作系統載入內存執行。
通常我們會將一些常用的函數封裝成一個庫,提供接口給其它程序文件調用。這樣一來,省去了重複寫該函數接口。當我們使用該函數時,就可以直接將我們所需要的文件鏈接到我們的程序中,提高了開發效率。
2.庫的分類
linux下的庫分爲2種:動態庫和靜態庫。
主要區別:
@靜態庫
1).文件命名方式:“libxxx.a”,庫名前加“lib”,後綴爲".a"。xxx爲靜態庫名。所以查找庫名的時候需要注意。
2).鏈接時機:靜態庫的代碼是在編譯過程中被載入程序中的。這就說明,只要程序編譯完成,就不受靜態庫的影響,比如,把靜態庫文件移至其它路徑等。
3).鏈接方式:是將整個函數庫的所有數據都加載進了目標。這樣的好處是編譯後的執行程序不再需要外部的函數庫支持。不足之處是:如果靜態庫更新或者發生改變,則程序必須需要重新編譯一次。
@動態庫
1).動態庫的命名方式:“lib”,後綴變爲“.so”。所以爲“libxxx.so” ;
2).鏈接時間:動態庫在編譯的時候並沒有被編譯進目標代碼,而是當你的程序執行到相關函數時才調用該函數庫裏的相應函數。這樣做缺點是因爲函數庫並沒有整合進程序,所以程序的運行環境必須提供相應的庫。優點是動態庫的改變並不影響你的程序,所以動態函數庫升級比較方便。
它們兩個還有很明顯的不同點:當同一個程序分別使用靜態庫,動態庫兩種方式生成兩個可執行文件時,靜態鏈接所生成的文件所佔用的內存要遠遠大於動態鏈接所生成的文件。(因爲靜態鏈接是在編譯時將所有的函數都編譯進了程序。而動態鏈接是在運行是才調用庫裏相應函數)