1. 程式人生 > >什麼是庫?(linux平臺下的理解)

什麼是庫?(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)中的部分提取出來,連結到可執行檔案中去,使可執行檔案在執行的時候不依賴於動態連結庫。

    動態編譯:動態編譯的可執行檔案需要附帶一個的動態連結庫。在執行時,需要呼叫其對應動態連結庫中的命令。

    從二者的定義,我們可以知道他們的優缺點:

    動態編譯一方面是縮小了執行檔案本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程式,只用到了連結庫中的一兩條命令,也需要附帶一個相對龐大的連結庫;二是如果其他計算機上沒有安裝對應的執行庫,則用動態編譯的可執行檔案就不能執行。

      靜態編譯正好和動態編譯互補。