linux上靜態庫的創建和使用
阿新 • • 發佈:2018-07-27
ont ret \n i++ 宋體 fin 命令 argc 特點
靜態庫的概念:
我們知道程序編譯一般需經預處理、編譯、匯編和鏈接幾個步驟。在我們的應用中,有一些公共代碼是需要反復使用,就把這些代碼編譯為"庫"文件;在鏈接步驟中,連接器將從庫文件取得所需的代碼,復制到生成的可執行文件中。這種庫稱為靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗余拷貝。
靜態庫的創建:
比如我有如下一些操作數組的函數需要將他們做成靜態庫,方便在使用時不需要重復定義,array.h頭文件如下:
1 #ifndef ARRAY_H_ 2 #define ARRAY_H_ 3 4 /* 5 函數功能: 對整形數組二分查查找法查找數組元素View Code6 參數: ary 數組名 start 查找開始的位置 end 查找結束的位置 7 返回值:成功返回數組的下標,失敗返回-1 8 */ 9 int bin_search(int *ary, int start, int end , int key); 10 11 /* 12 功能:對整形數組進行快速排序 13 參數: ary 數組名 low 需要排序的低位 high需要排序的高位 14 返回值: 無 15 */ 16 void sort_quick(int * ary, int low, int high); 17 18 /* 19 函數功能: 輸出一個整形數組的所有元素20 參數: ary 數組名 len 數組長度 21 返回值: 無 22 */ 23 void print_array(int * ary, int len); 24 25 #endif
array.c源文件如下:
1 #include "array.h" 2 #include <stdio.h> 3 4 /* 5 函數功能: 對整形數組二分查查找法查找數組元素 6 參數: ary 數組名 start 查找開始的位置 end 查找結束的位置 7 返回值:成功返回數組的下標,失敗返回-1 8 */ 9View Codeint bin_search(int *ary, int start, int end , int key) 10 { 11 int mid = (start + end) / 2; 12 if(start > end){ 13 return -1; 14 } 15 if(ary[mid] == key){ 16 return mid; 17 }else if(key > ary[mid]){ 18 return bin_search(ary, mid + 1, end, key); 19 }else{ 20 return bin_search(ary, start, mid - 1, key); 21 } 22 } 23 24 /* 25 函數功能: 輸出一個整形數組的所有元素 26 參數: ary 數組名 len 數組長度 27 返回值: 無 28 */ 29 void print_array(int * ary, int len) 30 { 31 int i = 0; 32 for(i = 0; i < len; i ++){ 33 printf("%d ", ary[i]); 34 } 35 printf("\n"); 36 } 37 38 /* 39 功能:對整形數組進行快速排序 40 參數: ary 數組名 low 需要排序的低位 high需要排序的高位 41 返回值: 無 42 */ 43 void sort_quick(int * ary, int low, int high) 44 { 45 if(low > high) 46 return ; 47 int i = low; 48 int j = high; 49 int key = ary[i]; 50 51 while(i < j){ 52 while(i < j && ary[j] >= key){ 53 j--; 54 } 55 ary[i] = ary[j]; 56 57 while(i < j && ary[i] <= key){ 58 i++; 59 } 60 61 ary[j] = ary[i]; 62 } 63 64 ary[i] = key; 65 sort_quick(ary, low, i - 1); 66 sort_quick(ary, i + 1, high); 67 }
在此我使用了工程目錄結構
include: 保存頭文件
src: 保存源文件
obj: 保存.o文件
lib: 保存庫文件
bin: 保存可執行文件
1:將我們的.c文件編譯成.o文件
gcc -c src/array.c -o obj/array.o -I include
2 :使用ar命令生成庫文件
ar rcs lib/libary.a obj/array.o
3:測試靜態庫的使用
查看lib目錄下是不是生成了一個叫libary.a的靜態庫文件
我們先簡單測試一下是否可用,寫好主函數,如下:
1 #include <stdio.h> 2 #include "array.h" 3 4 int main(int argc,char ** argv) 5 { 6 int ary[10] = {9,8,6,0,2,5,1,7,23,88}; 7 8 sort_quick(ary,0,9); 9 print_array(ary, 10); 10 return 0; 11 }View Code
編譯運行效果:
iotek@iotekclass:~/c/algorithm$ gcc src/main.c -o bin/array -Iinclude -Llib -lary
iotek@iotekclass:~/c/algorithm$ bin/array
0 1 2 5 6 7 8 9 23 88
-L 指定庫文件路徑
-l 指定庫名字
4: 將靜態庫加入系統路徑
iotek@iotekclass:~/c/algorithm$ sudo cp lib/libary.a /usr/lib/
iotek@iotekclass:~/c/algorithm$ sudo cp include/array.h /usr/include/
最後測試結果:
1 #include <stdio.h> 2 #include <array.h> 3 4 int main(int argc,char ** argv) 5 { 6 int ary[10] = {9,8,6,0,2,5,1,7,23,88}; 7 8 sort_quick(ary,0,9); 9 print_array(ary, 10); 10 return 0; 11 }View Code
iotek@iotekclass:~/c/algorithm$ gcc src/main.c -o bin/array -lary
iotek@iotekclass:~/c/algorithm$ ./bin/array
0 1 2 5 6 7 8 9 23 88
linux上靜態庫的創建和使用