静态库的概念:
我们知道程序编译一般需经预处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。
静态库的创建:
比如我有如下一些操作数组的函数需要将他们做成静态库,方便在使用时不需要重复定义,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
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 }
在此我使用了工程目录结构
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 }
编译运行效果:
[email protected]:~/c/algorithm$ gcc src/main.c -o bin/array -Iinclude -Llib -lary [email protected]:~/c/algorithm$ bin/array 0 1 2 5 6 7 8 9 23 88
-L 指定库文件路径
-l 指定库名字
4: 将静态库加入系统路径
[email protected]:~/c/algorithm$ sudo cp lib/libary.a /usr/lib/ [email protected]:~/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 }
[email protected]:~/c/algorithm$ gcc src/main.c -o bin/array -lary [email protected]:~/c/algorithm$ ./bin/array 0 1 2 5 6 7 8 9 23 88
原文地址:https://www.cnblogs.com/wyf174/p/9378871.html
时间: 2024-11-09 00:35:33