一 、库的概念
库:库是预先编译好的方法的集合。
库文件常存放的地点为/lib 或者 /usr/lib,库对应的头文件一般放在/usr/include 中.
在linux 中库的命名一般为: libxxx.a(静态库)
ibxxx.so(共享库)
二、静态库的生成
有两个方法 int add(int x, int y),int max(int x, int y) 分别在两个文件 add.c 和 max.c 中。
#include<iostream>
int add(int a,int b)
{
return a+b;
}
#include<iostream>
int max(int a,int b)
{
return a > b;
}
则静态库生成过程如下:
1) 将所有.c 源文件处理成.o 目标文件
gcc -c add.c 生成 add.o
gcc -c max.c 生成 max.o
2) 对生成的.o 目标文件打包生成静态库
假设静态库的名字为 libfoo.a
ar crv libfoo.a add.o max.o 其中 ar 是做库的命令,c 是创建库,r 是将方法添加到库里 v 显示过程,可以不要
三、共享库的生成
1)将所有的源文件处理成.o 目标文件
gcc -c add.c 生成 add.o
gcc -c max.c 生成 max.o
2) 对生成的.o 文件处理生成共享库,假设共享库的名字为 libfoo.so
gcc -shared -fPIC -o libfoo.so add.o max.o
四、静态库与共享库的使用
gcc -o main main.c -L/usr -lfoo 其中-l 指定的是库名,注意没有库的前缀和后缀 -L 指定路径
五、静态库与共享库的区别
静态库:编译链接时,包含到可执行程序中。
共享库:编译链接时,只做标记,没有包含,在运行程序的时候动态链接;
编译完成生成的.o文件中的方法地址没有确定,在链接时才确定方法(符号)地址。
LD_LIBRARY_PATH 指定动态链接的库,可以改变环境变量,程序运行时,优先在给变量指定的位置寻找库
六、关于库的linux命令
ldd main 查看某个程序使用哪些共享库
七、两种库的应用
1)静态库:如果有一个程序用到了某一个库,但是将这个代码给别人使用时,别人没有这个库,所以在其他人的主机上就不能运行该程序,由于静态库是在编译时期直接嵌入到源程序中的,所以它在编译时期将所有的库已经集成到文件中,所以不需要再次取链接,就不会出现找不到库的问题;
但是静态库这样的做法,导致了占用系统空间很大,而且如果发现了bug就必须得重新进行编译链接,对于一写大型的项目来说很不友好。
2)共享库,共享库是在链接时进行链接的,所以只需要将编译打包好的库保留一份,就可以用了,移植性很好,解决的静态库的占用系统空间以及产生bug不好修改的问题。