1. 程式人生 > >Linux 靜態庫和動態庫的製作和使用

Linux 靜態庫和動態庫的製作和使用

一、linux作業系統支援的函式庫分支

  靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程式

    優點:程式的執行環境中不需要外部的函式庫

    缺點:可執行程式大

  動態庫:又稱共享庫,libxxx.so,在程式執行時將庫載入到可執行程式中

    優點:可執行程式小

    缺點:程式的執行環境中必須提供相應的庫

  函式庫目錄:/lib  /usr/lib

二、靜態庫的製作

  ① 生成目標檔案:gcc  -c  file.c

  ② 靜態庫的建立命令 ar

    ar  -cr  libfile.a  file.o

    -c:Crete的意思

    -r:replace的意思,表示當插入的模組file.o已經存在libfile.a中,則覆蓋。反之ar顯示一個錯誤資訊。  

  ③ 操作靜態庫的幾個例項:

    情況1:如果從別處得到一個靜態庫libunknown.a,想知道其中包含哪些模組。

        命令--- ar  -t  libunknown.a

    靜態庫的編譯:gcc  -o  main  main.c  -L.  -lfile 編譯main.c 就會把靜態庫整合到main中。

      其中:  

        -L:指定靜態函式庫的位置供查詢,注意L後面還有個. ,表示靜態庫在當前目錄查詢。

        -l:則指定了靜態庫名,由於靜態函式庫的命名方式是lib***.a,其中lib和 .a可以忽略不寫。

  ④ 示例

   

   

   

   

三、動態庫的製作

  ① 生成目標檔案:gcc  -c  file.c

  ② gcc  -shared  -fpic  -o  libfile.so  file.o

     -fpic:產生位置無關程式碼

     -shared:生成共享庫

     用上述命令生成libfile.so動態函式庫。

      gcc  -o  out  main.c  -L.  -lfile

     此時還不能立即執行./out ,因為在動態函式庫使用時,會預設在 /usr/lib或 /lib目錄下去查詢動態庫,而此時我們生成的庫不在裡面

  ③ 示例

    

    

  第一種方法:

    libfile.so方到 /lib 或 /usr/lib中去

  第二中方法: 環境變數的方法,假設libsub.so在~/Coding/libsotest

    執行 export LD_LIBRARY_PATH=~/Coding/libsotest

       echo $LD_LIBRARY_PATH 檢視路徑是否新增成功

    

  第三種方法:修改sheel配置指令碼

    在/etc/ld.so.conf檔案里加入我們生成的庫目錄,然後/sbin/ldconfig

    /etc/ld.so.conf是一個非常重要的目錄,裡面存放的是連結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib

    或/lib 中讀取,所以想要順利執行,可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig

    ① 開啟ld.so.conf檔案    

      

    ② 向檔案中新增路徑

      

    ③ 用ldconfig執行sheel指令碼

      

      ④ 執行可執行程式

          

四、靜態庫和動態庫的大小比較

      

  由此可見:

      編譯成功後可執行程式,靜態庫比較大,因為這裡程式碼不多,所以看不到有很大差距