静态库、动态库的特点和 区别 以及动态库所在的位置

本文详细解析了库文件的概念,包括静态库(.a)和共享库(.so)的特点、创建方法及它们之间的区别。并介绍了如何使用库文件运行程序,以及如何通过ldd命令查看程序所依赖的共享库。

库文件:预先编译好的方法的集合

       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

         其中-shared:表明产生共享库,-fPIC:表明使用地址无关代码,作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。 

 

3、静态库和共享库的区别:

 

   静态库的课执行文件当中包含了库代码的一份完整的拷贝,因此,当它被多次使用时就会有多份没用的拷贝在内存当中,所以比较占内存;而动态库系统只需载入依次动态库,不同的程序可以得到内存当中相同的动态库的副本,因此会节省很多内存。

(1)同样的程序,使用静态库比使用共享库程序更大

(2)静态库在编译连接就加入到了可执行程序中,共享库是在运行程序是动态装载

(3)目标主机没有静态库,程序可以运行,没有共享库,运行不了

(4)共享库升级后,程序不需要重新编译,可以直接使用,静态库需要重新编译程序,链接新方法

(5)如何查看程序用到哪些共享库 :ldd(可以查看可执行程序用到哪些共享库),只能查看共享库

4、使用库文件运行程序:gcc -o main main.c -L路径 -l库名,通过改变环境变量(LD_LIBRARY_PATH)的值来指定使用哪个共享库

5、面试题相关

    一般查看的都是动态库ldd命令

   共享库在哪里呢?

   我们都知道地址空间分布共享库使在堆栈之间的一块地方,那么经过我测试我使用的linux2.6red版本,,它是位于代码段和数据段的低地址方向。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值