天天看點

C語言的靜态庫與共享庫1、庫的概念2、靜态庫3、共享庫(動态連結庫)4、不使用庫的方法

<a href="#1%E5%BA%93%E7%9A%84%E6%A6%82%E5%BF%B5">1庫的概念</a>

<a href="#2%E9%9D%99%E6%80%81%E5%BA%93">2靜态庫</a>

<a href="#2-1-%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E6%A6%82%E5%BF%B5">2-1 靜态庫的概念</a>

<a href="#2-2-%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E5%88%9B%E5%BB%BA">2-2 靜态庫的建立</a>

<a href="#2-2-1-%E9%9D%99%E6%80%81%E5%BA%93%E5%88%9B%E5%BB%BA%E7%9A%84%E5%91%BD%E4%BB%A4">2-2-1 靜态庫建立的指令</a>

<a href="#2-2-2-%E9%9D%99%E6%80%81%E5%BA%93%E5%88%9B%E5%BB%BA%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">2-2-2 靜态庫建立的準備工作</a>

<a href="#2-2-3-%E5%88%9B%E5%BB%BA%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E4%BE%8B%E5%AD%90">2-2-3 建立靜态庫的例子</a>

<a href="#2-3-%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8">2-3 靜态庫的使用</a>

<a href="#2-3-1-%E9%9D%99%E6%80%81%E5%BA%93%E4%BD%BF%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4">2-3-1 靜态庫使用的指令</a>

<a href="#2-3-2-%E9%9D%99%E6%80%81%E5%BA%93%E4%BD%BF%E7%94%A8%E7%9A%84%E4%BE%8B%E5%AD%90">2-3-2 靜态庫使用的例子</a>

<a href="#3%E5%85%B1%E4%BA%AB%E5%BA%93%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93">3共享庫動态連結庫</a>

<a href="#3-1-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E6%A6%82%E5%BF%B5">3-1 共享庫的概念</a>

<a href="#3-2-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E5%88%9B%E5%BB%BA">3-2 共享庫的建立</a>

<a href="#3-2-1-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E5%88%9B%E5%BB%BA%E5%91%BD%E4%BB%A4">3-2-1 共享庫的建立指令</a>

<a href="#3-2-2-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E5%88%9B%E5%BB%BA%E4%BE%8B%E5%AD%90">3-2-2 共享庫的建立例子</a>

<a href="#3-3-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8">3-3 共享庫的使用</a>

<a href="#3-3-1-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4">3-3-1 共享庫的使用指令</a>

<a href="#3-3-2-%E5%85%B1%E4%BA%AB%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BE%8B%E5%AD%90">3-3-2 共享庫的使用例子</a>

<a href="#4%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%BA%93%E7%9A%84%E6%96%B9%E6%B3%95">4不使用庫的方法</a>

函數庫是由系統建立的且有一定功能的函數集合。庫中存放函數的名稱和對應的目标代碼,以及連接配接過程中所需的重定位資訊,但是庫中對應的函數的源代碼一般是不可見的,而對應的頭檔案中可以看到它的對外接口(函數原型)。

Linux中标準的C函數庫放置在<code>/usr/lib</code>下,以檔案形式存放。使用者也可以根據自己的所需建立自己的使用者函數庫。函數庫分為靜态庫(.a)和共享庫(.so,ShareObj),共享庫在windows環境也叫動态連結庫(.dll)。

靜态庫是一些.o目标檔案的集合,一般以.a形式結尾。靜态庫在程式連結階段使用,連結器将程式要用到的函數從庫中提取出來,并整合到程式中,程式運作不再使用靜态庫了。由于每個程式要用到函數都從庫提取并整合在一起,是以可執行檔案夾會比較大。

<code>r</code>:表示将.o目标檔案加入到靜态庫中;

<code>c</code>:表示建立靜态庫;

<code>s</code>:表示生産索引;

或者

<code>-Ldir</code>:表示指定庫檔案所在的路徑中,預設在庫路徑在<code>/usr/lib</code>目錄下;

<code>-lname</code>:表示庫目錄的庫檔案<code>libname.a</code>或<code>libname.so</code>。如果庫檔案不是以<code>lib</code>開頭,如hello.a,隻能用用hello.a,不能用<code>-lhello</code>。

删除靜态庫檔案不會影響到可執行檔案的運作。

共享庫即動态連結庫,在linux中以.so(share object)為字尾,在windows中以.dll為字尾。程式開始啟動運作時,加載所需的函數,程式運作時也需要共享庫的支援。共享庫連結出來的檔案比靜态庫要小得多。Linux中所有标準的共享庫存放在<code>/usr/lib</code>目錄中。

<code>-shared</code>:表示要建立共享庫;

<code>-fpci或-fPCI</code>:表示建立産生獨立目标代碼,具體應用取決于平台;

運作可執行檔案提示找汪以庫檔案的解決方案

<code>sudo cp libmymathfun2.so /usr/lib</code>

<code>export LD_LIBRARY_PATH=庫檔案目錄</code>

删除靜态庫檔案會影響到可執行檔案的運作!(提示找不到庫檔案)

test1

test2

Wu_Being部落格聲明:本人部落格歡迎轉載,請标明部落格原文和原連結!謝謝!

C語言的靜态庫與共享庫1、庫的概念2、靜态庫3、共享庫(動态連結庫)4、不使用庫的方法

如果你看完這篇博文,覺得對你有幫助,并且願意付贊助費,那麼我會更有動力寫下去。

繼續閱讀