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腳本

      

      ④ 執行可執行程序

          

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

      

  由此可見:

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

http://www.cnblogs.com/jiangson/p/6077171.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM