编译链接实战(16)静态库vs动态库

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译链接实战(16)静态库vs动态库相关的知识,希望对你有一定的参考价值。

文章目录

基础概念

  • 静态库-独立exec
    我们把所有相关源代码进行编译,链接,最后生成可执行文件,这个文件不依赖于其他模块,是一个完整的可执行单元。 操作系统处理这类文件的流程是直接将elf的所有段拷贝到内存中,然后将PC指针指向entry就可以运行了,什么场景下会这样使用呢?

  • 简单的应用程序,不依赖于其他模块

  • 依赖于其他模块,其他模块以静态库的方式链接到应用程序

优点:程序是一个完整的可执行单元,不需要操作系统去进行重定向操作 缺点:每一个依赖于某个静态库的应用程序都会包含完整的静态库,这样每一个应用程序都会占用磁盘空间和内存空间,如果这样的应用程序有成千上万,那资源浪费很大

  • 动态库-非独立exec
    非独立exec我们这里只讲依赖于动态库的应用程序,一般情况我们在编写应用程序的时候,会用到很多库,这些库是其他工程师已经写好了,我们直接用就可以了,最典型的就是C和C++库,我们在写应用程序的时候只需要关注我们自己的业务功能就可以了。 外部库的存在方式以静态和动态2种,静态库在上面已经分析了,接下来我们着重分析动态库 如果我们的C库已经编译成了动态库,那么我们把他链接到我们的应用程序的时候,编译器只会对所需C库的符号进行分析,并把他记录到rel.dyn里,并不会真正的把动态库中的具体内容进行拷贝,所以这样编译出的应用程序就不包括动态库的内容,等到将应用程序真正加载到操作系统去运行的时候,我们操作系统中会有一个动态链接器dl去完成外部符号的链接与重定位

优点:

  • 应用程序依赖的动态库在内存中只存在一份,当然数据段是每个应用程序私有的,这样会节约磁盘空间和内存空间
  • 当我们要更新动态库时,只需要更新动态库文件即可,所依赖的应用程序不需要单独更新

缺点:

  • 应用程序的启动会牺牲一部分启动时间
  • 动态库更新需要考虑兼容性问题(exe依赖的动态库符号在exe编译链接时已经确定,更新动态库需要保证exe所依赖的符号兼容)

静态库制作

动态库制作

以上是关于编译链接实战(16)静态库vs动态库的主要内容,如果未能解决你的问题,请参考以下文章

gcc/g++实战之动态链接库与静态链接库编写

VS编译linux项目生成静态库并在另一个项目中静态链接的方法

C/C++编译问题,静态库,动态库。

linux找动态链接库默认位置,linux动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库

linux找动态链接库默认位置,linux动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库

C++开发新版本vs使用旧版本vs编译的静态库动态库