我们平常写代码包含的头文件就属于库文件,库文件又分为动态库和静态库两种。
动态库以.so结尾,静态库以.a结尾
静态库
静态库就是将.o文件打包成.a文件,在编译的时候和代码一起编译,编译完成之后程序运行不再需要静态库
生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o
目标静态库文件以lib开头以.a结尾,后面加上需要打包的.o文件
静态库的原理
在程序编译的时候直接把库中的代码拷贝到程序中进行编译
[root@localhost linux]# gcc main.c -L. -lmymath
在编译的时候第三方库要使用-L指定库路径,-l指定库名
静态库的优缺点
- 使用静态库会增加程序的大小
- 静态库重新编译,需要将重新重新编译
- 使用静态库不影响程序运行速度
动态库
生成动态库
root@localhost linux]# gcc -fPIC -c sub.c add.c
[root@localhost linux]# gcc -shared -o libmymath.so *.o
[root@localhost linux]# ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o
gcc默认使用的就是动态库链接所以gcc支持生成动态库
其中:
- fPIC:产生位置无关码
- shared:代表要生成共享库的类型
使用动态库
gcc main.o -o mian -L. -lmymath
在运行的时候,我们需要一些方法来使程序能找到动态库,有以下几种方法
- 将.so文件拷贝到系统共享库路径下面,例如/use/lib
- 更改系统环境变量指定的路径LD_LIBRARY_PATH
- 修改/etc/ld.so.conf文件,在文件中添加自己指定的路径,然后ldconfig刷新缓存
运行的动态库
使用动态库的程序在编译的时候内部使用到动态库的部分会动态链接到加载的动态库,不光程序要加载,动态库也要被加载
在程序使用库的时候,库中的内容会被拷贝到程序中的共享区,共享区的内容可以被多个进程共享以节约内存