一、概述
二、静态库的优缺点
优点:
- 寻址方便,速度快
- 库被打包到可执行程序中,直接发布可执行程序即可使用
缺点:
- 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
- 如果静态函数库改变了,那么你的程序必须重新编译
使用场合:
- 在核心程序上使用,保证速度,可忽视空间
- 主流应用于80、90年代,现在很少用
三、静态库的制作
(1)制作步骤
1)编译得到 *.o文件
gcc a.c b.c c.c -c
2)打包得到静态库 libmytest.a(就是一个打包.o文件的过程)
ar rcs libmytest.a a.o b.o c.o
- ar工具不包含在gcc中
- r–>将文件插入静态库中
- c–>创建静态库,不管库是否存在
- s–>写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
查看库中的符号(函数、全局变量等):nm libmytest.a
3)使用静态库
gcc + 源文件 + -L静态库路径 + 静态库名 + -l头文件目录 + o可执行文件名
gcc main.c -L ./-lmytest -l ./ -o app
- -L–>指定库所在的路径
- -l–>指定库的名字
- 去掉前缀lib
- 去掉后缀 .a
- 只留下中间部分
- -l–>头文件目录位置
gcc + 源文件 + 头文件 + libxxx.a
生成的静态库需要跟对应的头文件同时发布
- 头文件中存放的是函数接口(函数声明)
(2)实际操作
文件内容及路径分布如下:
gxl@gxl-virtual-machine:~/linux/jingtai$ tree
.
├── include
│ └── head.h
├── lib
├── main.c
└── src
├── add.c
└── sub.c
//head.h
//head.h
#include<stdio.h>
int add(int a, int b);
int sub(int a, int b);
//add.c
//add.c
#include"head.h"
int add(int a,int b)
{
return a+b;
}
//sub.c
//sub.c
#include"head.h"
int sub(int a,int b)
{
return a-b;
}
#include "head.h"
int main(void)
{
int a = 10, b = 10;
printf("%d + %d is %d
", a, b, add(a, b));
printf("%d - %d is %d
", a, b, sub(a, b));
return 0;
}
-
编译为 .o 文件,进入到 src 目录下执行:
-
将 .o 文件打包,制作成 libCalc.a 静态库
编译时需要加静态库名(记得路径),-I 包含头文件 -
使用静态库编译 main.c并执行 main,我们将 libCalc.a 移动到上层的 lib 中并退回到 calc 目录,编译 main.c 并执行:
-
可以用 nm 命令查看文件内容: