1 静态库
- 静态库对函数库的链接是放在编译时期完成的。
- 程序在运行的时与函数库再无瓜葛,移植方便。
- 浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).
- 编译时把静态库中的相关代码复制到可执行程序中。
- 优点:程序运行的时,无需加载库,运行速度更快
- 缺点:占用更多磁盘和内存空间,静态库升级后,需要重新编译链接。
1.1 如何创建静态库
-
编写源代码
只要是一个文件,文件的内容是一个子函数即可(目的是为了生成库)
vim filename1.c / vim filename2.c
-
生成相应的.o文件
gcc -c filename1.c -o filename1.o gcc -c filename2.c -o filename2.o
-
创建成相应的静态库
静态库的命名方式:
lib+库名.a
ar rcs libfile.a *.o # 注意:libfile.a中的file是库名!!! # ar ---> 用来创建代码库 # r ---> 在库中插入模块 # c ---> 创建一个库,不管库是否存在,都将创建 # s ---> 创建目标文件索引,这在创建较大的库时能加快时间
-
编译时链接静态库
gcc test.c -o test -L. -lfile # 注意:-L.中的点.代表当前路径(库的位置)
-
运行
./test
2.2 案例
main.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
// 功能:将指定的文件的行数以及大小进行显示
// 以只读的方式打开一个文件
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
perror("fail to fopen");
return -1;
}
int line = 0, size = 0;
// 函数1:实现行数的统计
cal_line_func(fr,&line);
// 函数2:实现大小的统计
cal_size_func(fr,&size);
printf("行数:%d行\n大小:%d\n",line,size);
fclose(fr);
return 0;
}
line.c
#include <stdio.h>
#include <string.h>
void cal_line_func(FILE *fr, int *p_line)
{
if(NULL == fr || NULL == p_line)
{
return;
}
char data[20] = {0};
while(1)
{
char *p_flag = fgets(data, sizeof(data),fr);
if(NULL == p_flag)
{
return;
}
if('\n' == data[strlen(data) - 1])
{
(*p_line)++;
}
}
}
size.c
#include <stdio.h>
void cal_size_func(FILE *fr, int *p_size)
{
if(NULL == fr || NULL == p_size)
{
return;
}
fseek(fr, 0, SEEK_END);
*p_size = ftell(fr);
rewind(fr);
return;
}