库基本知识
库的概念
库文件一般就是编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件(静态链接),或者运行可执行文件的时候被加载(动态链接),以便调用库文件中的某段代码。库文件无法直接执行,因为它的源代码中没有入口主函数,而只是一些函数模块的定义和实现,所以无法直接执行。程序库使程序更加模块化,重新编译更快,更新更容易。
库的类型
回顾一下,一个程序编译成可执行程序的步骤:

这其中静态库/动态库的类型有4种,也取决于是linux还是Windows平台:
| 库的类型 | 静态库 | 动态库 |
| Linux | .a | .so |
| Windows | .lib | .dll |
库的创建
不管需要制作的是静态库还是动态库,原材料都是.o文件 (可重定位文件) ,并且库文件内部不允许出现主函数main。
而无论是创建静态库还是动态库,基本步骤都如下:
- 将代码文件编译成目标文件.o
- 再把生成的.o文件一起编译生成静态库/动态库文件
库的创建和使用命令,详细可以参考文章:《详谈静态库和动态库的区别》
静态库
静态库与汇编生成的目标文件 .o 一起链接打包到可执行文件中的过程,叫静态链接。
静态库的特点
- 静态库对函数库的链接是放在编译时期完成的
- 编译程序的时候静态库的内容会被完整地复制到生成的可执行文件中,增加了可执行文件的大小
- 浪费空间和资源:如果多个程序使用同一个静态库,内存中可能存在多个静态库目标文件的副本
- 更新困难:当库函数代码被修改,就需要重新进行编译链接生成新的可执行程序
- 运行速度快:可执行程序中已经具备了所有执行程序所需要的任何东西
动态库
其实动态链接的出现,就是为了解决静态链接中的两个问题,一方面是空间浪费,另一方面就是更新困难。
试想一下,对于一个程序用户来说,如果程序日后有一个很小的改动更新,就导致整个程序需要重新下载,全量更新,这会有多难受
所以动态库其实是在程序运行时才被载入,是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。
动态库的特点
- 动态库的代码是在程序运行时被动态加载的
- 在编译链接过程中,动态库的引用会被放置到生成的可执行文件中,但动态库的实际代码并不会复制到可执行文件中
- 多个程序可以共享同一个动态库,节省了存储资源
- 更新方便,更新时只需要增量更新动态库即可,而无需将所有的程序再重新链接一遍
- 性能损失:链接推迟到了程序运行时,所以每次执行程序都需要进行链接
版权声明
本文参考文章:
- 详谈静态库和动态库的区别
https://blog.csdn.net/weixin_71478434/article/details/126588174?fromshare=blogdetail&sharetype=blogdetail&sharerId=126588174&sharerefer=PC&sharesource=2302_76260462&sharefrom=from_link - 深入浅出静态链接和动态链接
https://blog.csdn.net/kang___xi/article/details/80210717?fromshare=blogdetail&sharetype=blogdetail&sharerId=80210717&sharerefer=PC&sharesource=2302_76260462&sharefrom=from_link - 静态库与动态库的区别
https://blog.csdn.net/qq_51372804/article/details/136554480?fromshare=blogdetail&sharetype=blogdetail&sharerId=136554480&sharerefer=PC&sharesource=2302_76260462&sharefrom=from_link
901

被折叠的 条评论
为什么被折叠?



