静态库和共享库(动态库)的区别
根据链接时期不同,分为静态库和共享库,静态库是在程序编译时链接的,共享库是在程序运行时链接的。
库是预先编译好的方法的集合,命名一般为libxx.a(静态库)libxx.so(动态库),库文件常存放的地点为/lib或/usr/lib,库对应的头文件一般存放在/usr/include中
add.c
Int add(int a,int b)
{
return a+b;
}
max.c
Int max(int a,int b)
{
return a>b,a?b;
}
main.c
#include<stdio.h>
Int add(int a,int b);
Int max(int a,int b)
Int main()
{
Int a=10;
Int b=11;
Printf(“a+b=%d\n”,add(a,b));
Printf(“max=%d\n”,max(a,b));g
}
1、静态库的生成
两种方法int add(int a,int b),int max(int a,int b)分别在两个文件add.c和max.c中存放,静态库的生成过程如下
1):将所有的.c文件编译成.o目标文件
gcc -c add.c 生成add.o
gcc -c max.c 生成max.o
2) : 对生成的.o目标文件打包生成静态库
ar crv libfoo.a add.o max.o //libfoo.a是库的名字
ar:做库的命令
c:创建库
r:将方法添加到库里
v:显示过程,可以不要
3):使用静态库
gcc -o main main.c -L. -lfoo //这里写的foo是去掉前后缀后库的名字
-L:指定路径 .代表当前路径
-l:指定库名
2 、共享库的生成
1)将所有的.c文件编译成.o目标文件
gcc -c max.c
gcc -c add.c
2) 对生成的.o文件处理生成共享库,共享库的名字为libfoo.so
gcc -shared -fPIC -o libfoo.so add.o max.o
-shared 表示输出结果是共享库类型的
-fPIC 表示使用地址无关代码(Position Independent Code)技术来生产输出文件
3)库的使用
gcc -o main main.c -lfoo
cp libfoo.so /usr/lib
3、小结:
静态库包含了目标代码即.o文件,不利于磁盘,空间的使用,造成系统空间的浪费
共享库由于在程序运行时链接,所以运行速度稍低
程序在链接时,一般优先链接共享库,除非用static参数指定链接静态库