什麼是庫?(linux平臺下的理解)
什麼是庫?
作者:黑色印記
我所認為的庫,就是裡面有許多的庫檔案。而庫檔案的特點是:你可以使用它,但你不能看到它是如何實現的。因而庫檔案也賦予了庫相同的特性。大家一定很迷惑為什麼要賦予庫檔案和庫這樣的特性。那是因為庫檔案裡面一般是一種技術的核心程式碼。為了將這種技術出售出去,供別人使用,但又不希望洩露自己的技術。於是便賦予了庫這個特性。這也是我們為什麼學習庫的原因。
知道了庫的重要性,那我們就要知道庫在哪裡?linux下庫主要處於/lib和/usr/lib目錄中。兩者的區別在於:
/lib 指系統執行相關的庫檔案
/usr/lib 一般指第三方軟體的庫檔案
瞭解了庫的重要性,位置。那我們就要了解庫的種類了。庫有兩種型別。分別是靜態庫和動態庫。我們要區別兩者的不同,就先看它們的定義。
靜態庫: 在執行程式之前就加入了到了執行程式碼中,成為執行程式的一部分,一般是以.a為檔案字尾。
動態庫: 在執行程式啟動時載入到執行程式碼中,一般是以.so為檔案字尾。
從靜態庫,動態庫的定義中,我們可以知道兩者的優缺點:
(1)動態庫的編譯時間短。
(2)靜態庫的執行時間短。
(3)靜態庫程式碼太擁擠,不易升級。
(4)靜態庫程式碼的佈置比較好。
當我們瞭解到庫有兩個種類,那我們該如何選擇呢?什麼時候選擇靜態庫,什麼時候選擇動態庫?這主要從兩個方面進行選擇。
第一點,根據軟體是否經常升級,若經常升級,則選擇動態庫。
第二點,封裝程式碼的大小,若程式碼過大,選擇靜態庫。
瞭解到庫的重要性,庫的位置,以及庫的種類,接下來,我們就要學會如何建立一個庫和如何使用一個庫?
在建立一個庫,以及使用一個庫時,我們需要使用一些指令,讓我給大家慢慢介紹。
靜態庫的建立與使用:
建立: gcc -c test.c (將c檔案生成.o檔案)
ar rcs libtest.a test.o (將.o檔案生成libtest.a靜態庫。其中lib 和.a是靜態庫的字首和字尾。中間 test 才是靜態庫的名)
使用: gcc main.c libtest.a 或者 gcc main.c -ltest -L.
-l 指連結庫,其中test是庫名。
-L 指連結的路徑
. 指當前目錄
動態庫的建立與使用:
建立: gcc -shared -fPIC -otest.so test.c (其中test是庫名)
使用: gcc main.c ./test.so -o 可執行檔名
瞭解到了動態庫,以及靜態庫,我就覺得有必要向大家介紹一下什麼是靜態編譯,什麼是動態編譯?
靜態編譯:靜態編譯,就是編譯器在編譯可執行檔案的時候,將可執行檔案需要呼叫的對應動態連結庫(.so或.lib)中的部分提取出來,連結到可執行檔案中去,使可執行檔案在執行的時候不依賴於動態連結庫。
動態編譯:動態編譯的可執行檔案需要附帶一個的動態連結庫。在執行時,需要呼叫其對應動態連結庫中的命令。
從二者的定義,我們可以知道他們的優缺點:
動態編譯一方面是縮小了執行檔案本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程式,只用到了連結庫中的一兩條命令,也需要附帶一個相對龐大的連結庫;二是如果其他計算機上沒有安裝對應的執行庫,則用動態編譯的可執行檔案就不能執行。
靜態編譯正好和動態編譯互補。