什么是库?
库就是预先编译好的方法或者函数的集合,且都具有一定的成熟度。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
事实上,我们平常写的代码多多少少都会用到库中的函数,所以库中的代码我们是可以复用的,从而提高程序运行效率。
库主要分为静态库和共享库(也可称为动态库),所谓的静态和动态是指链接阶段如何处理库。
静态库
1、Linux下静态库名为 libxxx.a,Windows下为 xxx.lib
2、一定会生成.o文件
3、在链接阶段,将汇编生成的.o文件和用到的库一起链接打包到可执行程序中
4、因为静态库与汇编生成的目标文件一起链接为可执行文件,其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合
5、静态库对函数库的链接是在编译时期完成,所以程序在运行时与函数库再没有关系,因为可执行文件中已经包含了相应的代码。
6、静态库的缺点就是浪费了空间和资源,生成的可执行文件体积过大
7、打包做出库,ar crv libxx.a *.o 生成库名
使用 gcc -o test test.c -L -l (L后指定路径 l后指定库名),使用C库默认会搜索,其它库不搜索,用到哪个别的库需要指定库名
总结:因为生成的可执行文件的体积过大,所以导致对空间造成了巨大的浪费。不仅有以上这种缺点,而且如果静态库有所更新,就算是很小的一点问题,那么相应的程序也全都要去更新。所以为了弥补不足,就有了共享库。
共享库
1、Linux下动态库名为 libxxx.so,Windows下为 xxx.dll
2、不是必须生成.o文件
3、在链接阶段只是对使用的库做了标记,并没有包含具体的方法实现
4、动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。
5、如果不同的应用程序调用同一个库,那么在内存中只会有一份该共享库的实例,规避了空间浪费问题。
6、可以实现进程之间的资源共享,也就是被称为共享库的原因。
7、生成共享库 gcc -shared -fPIC -o libmyfoo.so *.o
对库的使用 gcc -o main main.c -L路径 -l库名
总结:动态库把对库函数的链接载入推迟到程序运行的时期。因为所调用的库函数不会包含在可执行文件中,而且动态库在程序运行时才被载入,所以也解决了静态库的不足,将程序升级变得简单。
注:查看当前程序使用了哪些共享库:ldd + 程序名