1.何为库
库文件是预先编译好的方法的集合。
在windows系统下,静态库的扩展名为:.lib 动态库的扩展名为:.DLL
在Linu系统下,静态库的扩展名为:.a, 动态库的名称为:.so
2.特点
静态库:在链接的过程中,连接器从库文件中取得所需的代码,复制到生成的可执行文件中。因此,静态库在程序的链接阶段被复制到程序中,和程序的执行过程没有关系。
动态库:动态库在链接阶段并没有被加载到程序当中,而程序在运行时被系统动态加载到内存当中供程序使用。
3.创建方式
静态库的创建方式:
eg:有两个源文件:main.c ,max.c
1)gcc -c main.c max.c (得到main.o 和max.o)
2)使用ar将目标文件归档
ar crv libxxx.a main.o max.o;
即libxxx.a为我们创建的静态库
动态库的创建方式:
eg:有一个源文件 max.c
1)gcc -fPIC _shared -o libxx.so max.c
上行代码等价于:gcc -c -fPIC max.o
gcc -shared -o libxx.so max.o
即libxx.so 为生成的共享库;
4.库的使用
参数:-l:指定库名
-L:指定路径
gcc -o main main.c -lfoo
5.区别
静态库的可执行文件包含了库代码的一份完整拷贝,因此,当它被多次使用时就会有多分没用的拷贝在内存中,比较占内存
动态库系统只需要载入一次,不同的程序可以得到内存当中相同的动态库副本,因此节省很多内存。
6.笔面试问题
1.使用什么命令可以查看某个进程使用了哪些库
使用ldd main命令
2.制作共享库时,-fPIC含义是什么
表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的