Linux下庫的概念
靜態庫和共享庫
靜態庫是指在我們的應用中,有一些公共代碼是需要反覆使用,就把這些代碼編譯爲“庫”文件;在鏈接步驟中,連接器將從庫文件取得所需的代碼,複製到生成的可執行文件中的這種庫。
注:靜態庫是在鏈接的時候複製到可執行文件中,則說明靜態庫是在文件執行前以嵌入的方式放置到可執行文件裏面構成可執行文件的一部分。這樣的好處是提高了程序的執行效率(速度),但是缺點也很明顯,因爲是嵌入到可執行文件中所以會增加文件存儲過程中磁盤的佔用以及運行過程中內存的佔用率。
而動態庫則和靜態庫不一樣,動態庫並不會在連接的時候作爲一個拷貝嵌入到可執行文件中,而是在程序的執行前動態的調用。
注:和靜態庫一比較兩者的區別也就很明顯了。共享庫不用在連接的時候嵌入可執行文件中提高了程序的靈活性,如果需要更新也不用重新編譯代碼只需要替換庫就可以。當然相比之下缺點也就很明顯了,在執行效率上沒有靜態庫那麼高。
靜態庫和共享庫都是共享程序代碼的方式。在linux中靜態庫以.a作爲擴展名而windows系統下則以.lib作爲擴展名;而在linux中共享庫則以.so作爲擴展名,在windows中則以.dll做爲擴展名。
庫的編寫
靜態庫
靜態庫是obj文件的一個集合,使用ar生成。
Test文件夾下三個文件main.c、test.c、test.h |
main.c 1 #include<stdio.h> 2 #include"test.h" 3 int main() 4 { 5 printf("The add=%d\n",add(12,34)); 6 return 0; 7 } |
test.h 1 int add(int ,int); |
test.c 1 int add(int a,int b) 2 { 3 int sum=a+b; 4 return sum; 5 } |
1 生成目標文件test.o root@zhangyu-QiTianM4500-N000:test7# gcc -o test.o -c test.c 2 生成靜態庫 test.a root@zhangyu-QiTianM4500-N000:test7# ar -rcs test.a test.o 使用靜態庫 root@zhangyu-QiTianM4500-N000:test7# gcc -o main main.c test.a 執行結果: root@zhangyu-QiTianM4500-N000:test7# ./main |
拓展:
ar命令的使用:點擊打開鏈接 |
ar命令選項 d -----從指定的靜態庫文件中刪除文件 m -----把文件移動到指定的靜態庫文件中 p -----把靜態庫文件中指定的文件輸出到標準輸出 q -----快速地把文件追加到靜態庫文件中 r -----把文件插入到靜態庫文件中 t -----顯示靜態庫文件中文件的列表 x -----從靜態庫文件中提取文件 還有多個修飾符修改以上基本選項,詳細請man ar以下列出三個: a -----把新的目標文件(*.o)添加到靜態庫文件中現有文件之後 b-----***************************************之前 v -----使用詳細模式 |
共享庫和動態鏈接
其實共享庫和動態鏈接庫在格式上是一致的。但是共享庫和動態鏈接庫在實現上有一定的區別。共享庫在程序的執行前(啓動時)動態加載,而動態鏈接庫則允許在程序執行過程中加載。針對這一部分網上有很多相關資料,因爲目前針對這一塊的分析不多,所以這部分不再進一步敘述。動態鏈接庫有相關的操作函數這一點是需要注意的。