1. 程式人生 > >linux上靜態庫的創建和使用

linux上靜態庫的創建和使用

ont ret \n i++ 宋體 fin 命令 argc 特點

靜態庫的概念:

  我們知道程序編譯一般需經預處理、編譯、匯編鏈接幾個步驟。在我們的應用中,有一些公共代碼是需要反復使用,就把這些代碼編譯為"庫"文件;在鏈接步驟中,連接器將從庫文件取得所需的代碼,復制到生成的可執行文件中。這種庫稱為靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗余拷貝。

靜態庫的創建:

  比如我有如下一些操作數組的函數需要將他們做成靜態庫,方便在使用時不需要重復定義,array.h頭文件如下:

技術分享圖片
 1 #ifndef ARRAY_H_
 2 #define ARRAY_H_
 3 
 4 /*
 5     函數功能: 對整形數組二分查查找法查找數組元素
6 參數: 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
View Code

  array.c源文件如下:

技術分享圖片
 1 #include "array.h"
 2 #include <stdio.h>
 3 
 4 /*
 5     函數功能: 對整形數組二分查查找法查找數組元素
 6     參數: ary 數組名 start 查找開始的位置 end 查找結束的位置
 7     返回值:成功返回數組的下標,失敗返回-1
 8 */
 9
int 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 }
View Code

  在此我使用了工程目錄結構                  技術分享圖片

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上靜態庫的創建和使用