標籤:使用 os io strong 檔案 ar 代碼 on
n 基本架構:
a) 外部庫的使用
b) 靜態庫與共用庫的區別
c) 靜態庫的產生
d) 共用庫的產生
2.1外部庫的使用
2.1.1庫檔案的特點:
1)庫檔案實際上是一些.o檔案的打包;
2)是按照可重用的原則編寫的;
3)通常由一組相互關聯的函數構成;
4)軟體的可維護效能好,若軟體升級的話,通常只需修改庫代碼,而不用修改使用庫的代碼(只要使用庫的介面沒有改變)。
2.2.2標頭檔與庫檔案的系統存放位置
標頭檔:/usr/include /usr/local/include
庫檔案:/usr/lib /usr/local/lib
2.2.3 外部庫的使用
-lname 表示要連結libname.so 或者libname.a 庫檔案
如果靜態庫和共用庫均存在,則系統會優先連結共用庫。
2.2靜態庫與共用庫的區別
靜態庫(.a)的特點:
1)程式在連結的時候把所需要庫中相應的函數代碼連結到可執行檔中;
2)啟動並執行時候不再需要靜態庫;
3)若多個程式使用同一個庫,則需要庫中相關代碼的多個copy,所以對記憶體和磁碟空間耗費較大。
共用庫(.so)的特點:
1) 當程式運行時,由作業系統將庫代碼從磁碟載入到記憶體中,這個過程叫做動態連結;
2) 啟動並執行時候需要共用庫的存在;
3)若多個程式使用同一個共用庫,則當程式啟動並執行時候,只需向記憶體載入一份庫代碼,多個程式共用使用同一份庫;
又因為可執行程式中僅僅包含它用到的函數入口地址的一個表,而不是庫代碼的拷貝;
所以節省了記憶體和磁碟空間;
4)因為可執行程式中沒有庫代碼的相關拷貝,所以維護效能好。
2.3靜態庫的產生
2.3.1靜態庫的產生
Ar rcs libname.a name.o
Rcs表示(replace、create、save)
* Ar t 查詢一個靜態庫中有多少個.o檔案
2.3.2庫的搜尋路徑:
1) 從左至右搜尋 –I –L 指定的目錄; (最好使用第1種方法來設定)
2) 由環境變數指定的目錄
設定方法:給設定檔(~/.bash_profile)中相應的環境變數添加搜尋路徑:
export C_INCLUDE_PATH=……
export CPP_INCLUDE_PATH=……
export LIBRARY_PATH=……
然後執行該設定檔即可。
3) 系統預設的搜尋目錄
/usr/include /usr/lib
2.4共用庫的產生
2.4.1共用庫的產生
Gcc –shared -fPIC hello.o –o libhello.so
fPIC: 用來產生位置無關碼(position independent code)
2.4.2運行共用庫需要做的一些配置(2種方法)
1)拷貝.so檔案到系統共用庫路徑下: /usr/lib
2) 設定環境變數: LD_LIBRARY_PATH (最好使用第二種方法)
l ldd + 可執行檔名: 查詢該程式在執行的時候需要載入哪些共用庫。