静态库与动态库的区别

什么是库?

库就是预先编译好的方法或者函数的集合,且都具有一定的成熟度。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

事实上,我们平常写的代码多多少少都会用到库中的函数,所以库中的代码我们是可以复用的,从而提高程序运行效率。

库主要分为静态库和共享库(也可称为动态库),所谓的静态和动态是指链接阶段如何处理库。

静态库

1、Linux下静态库名为 libxxx.a,Windows下为 xxx.lib

2、一定会生成.o文件

3、在链接阶段,将汇编生成的.o文件和用到的库一起链接打包到可执行程序中

4、因为静态库与汇编生成的目标文件一起链接为可执行文件,其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合

5、静态库对函数库的链接是在编译时期完成,所以程序在运行时与函数库再没有关系,因为可执行文件中已经包含了相应的代码。

6、静态库的缺点就是浪费了空间和资源,生成的可执行文件体积过大

7、打包做出库,ar crv libxx.a *.o  生成库名
     使用 gcc -o test test.c -L -l  (L后指定路径  l后指定库名),使用C库默认会搜索,其它库不搜索,用到哪个别的库需要指定库名

总结:因为生成的可执行文件的体积过大,所以导致对空间造成了巨大的浪费。不仅有以上这种缺点,而且如果静态库有所更新,就算是很小的一点问题,那么相应的程序也全都要去更新。所以为了弥补不足,就有了共享库。

共享库 

1、Linux下动态库名为 libxxx.so,Windows下为 xxx.dll

2、不是必须生成.o文件

3、在链接阶段只是对使用的库做了标记,并没有包含具体的方法实现

4、动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。

5、如果不同的应用程序调用同一个库,那么在内存中只会有一份该共享库的实例,规避了空间浪费问题。

6、可以实现进程之间的资源共享,也就是被称为共享库的原因。

7、生成共享库 gcc -shared -fPIC -o libmyfoo.so *.o
     对库的使用 gcc -o main main.c -L路径 -l库名

总结:动态库把对库函数的链接载入推迟到程序运行的时期。因为所调用的库函数不会包含在可执行文件中,而且动态库在程序运行时才被载入,所以也解决了静态库的不足,将程序升级变得简单。

注:查看当前程序使用了哪些共享库:ldd + 程序名

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值