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

  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

linux上静态库的创建和使用的相关文章

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

linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只有运行时找不到对应动态库才会报错 gcc创建和使用静态库.动态库 gcc动态链接库*.so文件的生成与使用方法 原文地址:https://www.cnblogs.com/gdut-gordon/p/10390532.html

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

Linux下静态库和动态库的制作与使用

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: "Times New Roman", serif } h2 { margin-top: 14.0pt; margin-right: 0cm; margin-bottom: 14.0pt; margin-left: 28.8pt;

Linux下静态库生成和使用

Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. 2.标准系统库可在目录/usr/lib与/lib中找到.比如,在类Unix系统中C语言的数序库一般存储为文件/usr/lib/libm.a.该库中函数的原型声明在头文件/usr/include/math.h中. 3.C标准库本身存储为/usr/lib/libc.a,它包含ANS1/ISO标准指定的函

linux上安装库注意事项

最近安装libevent, 运行的时候报错:大意是找不到libevent-2.1.so.4 在安装的时候,安装的位置是/usr/local,也做了软链接 ln -s /usr/local/lib/libevent-2.1.so.4 /usr/lib/libevent-2.1.so.4 在运行时就是报错,网上查找了下,原来还有其它道道,新人伤不起. 以libevent安装为示例: -1: 解压后,进入 ./configure -prefix=/usr/local make make install

动态库和静态库的创建

一.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.Linux系统有几个重要的目录存放相应的函数库,如/lib, /usr/lib; 头文件放在/usr/include. 静态库: 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序

linux 动态静态库

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.  1  静态库和动态库的区别1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a(2)利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,它的优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.这给它带来的缺点为如果静态函数库改变了,那么你的程序必须重新编译.1.2. 动态函数库    (1)动态函数库的名字一般是li

Linux下静态库与动态库

一.基本概念 1.1.什么是库        在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由于 windows 和 linux 的平台不同(主要是编译器.汇编器和连接器 的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍 linux 下的库. 1.2. 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同: 静态库的代码在编译过程中已经被