linux上静态库的创建和使用

Posted wyf174

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux上静态库的创建和使用相关的知识,希望对你有一定的参考价值。

静态库的概念:

  我们知道程序编译一般需经预处理、编译、汇编链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。

静态库的创建:

  比如我有如下一些操作数组的函数需要将他们做成静态库,方便在使用时不需要重复定义,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("
");
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

编译运行效果:

[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 }
View Code
[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 

  

 

 


以上是关于linux上静态库的创建和使用的主要内容,如果未能解决你的问题,请参考以下文章

Linux 静态库和共享(动态)库的创建与使用详解

详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

Linux上静态库和动态库的编译和使用

动态库和静态库的创建

Linux库的创建和使用

第1章 Linux系统编程入门:静态链接库的创建和使用