库文件:预先编译好的方法的集合
Windows系统静态库扩展名为:.lib
动态库扩展名为:.DLL
Linux系统静态库扩展名为:.a
动态库扩展名为:.so
1、libXX.a:静态库:可执行程序会包含用到的方法
(1)特点:程序在链接的过程当中,链接器从库文件找那个取得所需代码,赋值到生成的可执行文件当中。因此,静态库是在程序法人链接阶段被复制到程序当中,和程序的运行过程没有关系。
(2)创建:
1)先将所有的*.c编译成*.o
2)使用ar将目标文件归档:ar crv libxx.a *.o
2、libXX.so:共享库:可执行程序不包含用到的方法,只做标记
(1)特点:动态库在链接阶段并没有被加载到程序当中,而程序在运行时被系统动态加载到内存当中供程序使用。
(2)创建:
1)先将所有的*.c编译成*.o
2)gcc -shared -fPIC -o libxx.so *.o
3、静态库和共享库的区别:
静态库的课执行文件当中包含了库代码的一份完整的拷贝,因此,当它被多次使用时就会有多份没用的拷贝在内存当中,所以比较占内存;而动态库系统只需载入依次动态库,不同的程序可以得到内存当中相同的动态库的副本,因此会节省很多内存。
(1)同样的程序,使用静态库比使用共享库程序更大
(2)静态库在编译连接就加入到了可执行程序中,共享库是在运行程序是动态装载
(3)目标主机没有静态库,程序可以运行,没有共享库,运行不了
(4)共享库升级后,程序不需要重新编译,可以直接使用,静态库需要重新编译程序,链接新方法
(5)如何查看程序用到哪些共享库 :ldd(可以查看可执行程序用到哪些共享库),只能查看共享库
4、使用库文件运行程序:gcc -o main main.c -L路径 -l库名,通过改变环境变量(LD_LIBRARY_PATH)的值来指定使用哪个共享库
参数意义:
(1)-shared:表明产生共享库
(2)-fPIC:表明使用地址无关代码,作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
5、面试题:
(1)静态库和动态库如果两个中都有相关的函数系统会默认调用哪一个?
答:默认为动态库
(2)共享库会被映射到进程地址空间的哪部分,可能问进程地址空间的分布图。
答: