库文件是预先编译好的方法的集合,一种可执行的二进制代码(但不可独立执行),可以被操作系统载入内存执行。Windows和linux二者的库的二进制是不兼容的。Windows系统静态库的扩展名为.lib,动态库扩展名为.dll。Linux系统静态库的扩展名为.a,动态库的扩展名为.so。
Linux中有两种库:静态库和动态库(共享库)。
静态库:
1. 特点:
程序在链接的过程当中,链接器从库文件中取得所需代码,复制到生成的可执行文件当中。因此,静态库是在程序的链接阶段被复制到程序当中,和程序的执行过程没有关系。
2. 创建:
Eg:有两个源文件main.c和max.c
1) gcc -c main.c max.c(得到main.o,max.o)
2) ar crv libxxx.a main.o max.o(使用ar将目标文件归档,**libxxx.a即为我们所创建的静态库)
3.使用ar命令查看某个静态库由哪些.o文件组成。
动态库:
1.特点:
动态库在链接阶段并没有被加载到程序当中去,在运行时被系统动态加载到内存中供程序使用。
2.创建:
Eg:有一个源文件 max.c
a) gcc -fPIC - shared -o libxx.so max.c
上行代码等价于: gcc -c -fPIC max.c
gcc -shared -o libxx.so max.o(libxx.so就是我们要生成的动态库)
3.当系统加载动态库文件时,不仅要知道程序所依赖的共享库的名字,还需要知道绝对路径,此时就需要系统动态
载入器。
4.使用ldd命令可以查看一个可执行程序依赖哪些动态库或动态库又依赖于哪些动态库。
静态库和共享库的区别:
静态库的可执行文件当中包含了库代码的一份完整的拷贝,因此当它被多次使用时就会有多份没用的拷贝在内存当中,所以比较占内存;而动态库系统只需载入一次动态库,不同的程序可以得到内存当中相同的动态库的副本。因此会节省很多内存。
静态库和动态库同时存在时gcc、g++的程序,默认链接动态库。