静态库可以认为是一些目标代码的集合,即对多个目标代码归档到一个文件中。命名一般以”lib“开头,以”.a“结尾,如“libmycal.a”。静态库相比于动态库存在的优点是:引用了静态库的代码进行编译链接后,会将静态库的副本包含进应用程序中,这样在别的机器上运行时,就不用担心找不到库了。缺点就是:当多个应用程序调用相同的静态库时,内存中会有多个静态库的副本被载入,每个库归相应的应用程序调用,消耗内存。
- 演示生成静态库
1) 查看文件目录
#tree
.
├── main.c
└── src
├── add.c
├── common.h
├── dive.c
├── mul.c
└── sub.c
2) 生成静态库
#mkdir lib
#ls
lib main.c src
#cd src/
# ls
add.c common.h dive.c mul.c sub.c
//生成目标文件(.o)
#gcc -c -fPIC *.c
#ls
add.c add.o common.h dive.c dive.o mul.c mul.o sub.c sub.o
//生成静态库libmycal.a
#ar rcs libmycal.a *.o
# ls
add.c add.o common.h dive.c dive.o libmycal.a mul.c mul.o sub.c sub.o
//查看静态库中包含的信息
#nm libmycal.a
add.o:
0000000000000000 T add
dive.o:
0000000000000000 T dive
mul.o:
0000000000000000 T mul
sub.o:
0000000000000000 T sub
//移动静态库到lib目录中
#mv libmycal.a ../lib
#cd ..
#lib main.c src
lib main.c src
#tree
.
├── lib
│ └── libmycal.a
├── main.c
└── src
├── add.c
├── add.o
├── common.h
├── dive.c
├── dive.o
├── mul.c
├── mul.o
├── sub.c
└── sub.o
2 directories, 11 files
使用静态库
// -I指定头文件目录,注意-I和之间没有空格
#gcc -Isrc main.c lib/libmycal.a -o app
#./app
9
注意:ldd命令只是检测动态库,不能检测静态库。