Linux(4):库文件

库文件:预先编译好的方法的集合
       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)共享库会被映射到进程地址空间的哪部分,可能问进程地址空间的分布图。

答:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值