靜态庫類似windows中的靜态lib
特點:包含函數代碼聲明和實作,連結後所有代碼都嵌入到宿主程式中。
隻在編譯時使用,執行時不再需要該靜态庫。
2.靜态庫編寫
示例如下:
addvec.c


multvec.c


使用AR工具建立靜态庫檔案:
3.靜态庫使用
test2.c


編譯-連結-運作程式
1)-static參數,表明是靜态連結,編譯出的是完整的可執行目标檔案。
2)當連結器進行連結時,會判斷main函數裡調用了addvec.o中的addvec函數,
沒有調用multvec.o中的任何函數,是以,連結器隻會拷貝addvec.o到可執行檔案。
4.什麼是共享庫
共享庫類似windows中的動态連結庫dll
特點:包含函數代碼聲明和實作。
隻在運作時使用,由動态連結器連結和加載。
根據連結和加載共享庫的時機可分為以下兩類:
1)自身加載型共享庫。
2)運作時加載型共享庫
5.自身加載型共享庫。
類似windows中的隐式連結
連結時,将共享庫的聲明資訊連結到可執行檔案,
應用程式加載時,動态連結庫解析聲明資訊,加載共享庫的實作到存儲器,重定位應用程式中聲明資訊到實際位址。
6.自身加載型共享庫使用示例
使用-shared參數,訓示編譯器建立一個共享庫。
如下所示,我們建立了一個共享庫,并通過自身加載型來使用該共享庫。
1)-fPIC參數,訓示編譯器生成代碼無關的代碼
2)在連結時,沒有拷貝共享庫libvec.so的實作,隻拷貝了一些重定位和符号表資訊
3)程式加載時,動态連結器會解析共享庫libvec.so中代碼和資料的引用,重定位完成連結任務。
重定位libvec.so的文本和資料到存儲器段
重定位p2中引用的libvec.so到以上存儲器段
最後連結器将控制傳遞給程式,此時,共享庫的位置就固定了。
7.運作時加載型共享庫
類似windows中的顯式連結
無需編譯時連結,可在運作過程中加載和解除安裝共享庫。
8.運作時加載型共享庫使用示例
Linux提供了一組運作過程中加載和解除安裝共享庫的API,如下所示:
#include<dlfcn.h>


根據以上API,我們可以友善地加載和解除安裝共享庫,如下所示:


運作程式:
其中,-ldl參數,表示程式運作時需要用到共享庫
參考:http://www.cnblogs.com/shijingjing07/p/5608104.html
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/7655109.html,如需轉載請自行聯系原作者