一、静态链接库与动态链接库的简介

  1. C或C++程序从源文件到生成可执行文件需经历 4 个阶段
    分别为预处理、编译、汇编和链接。
    链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件和程序中用到的库文件整合为一个可执行文件。

  2. 虽然库文件明确用于链接,但编译器提供了2种实现链接的方式,分别称为静态链接和动态链接。
    采用静态链接方式实现链接操作,的库文件称为静态链接库;
    采用动态链接方式实现链接操作,的库文件称为动态链接库。

  3. 在 Linux 发行版系统中,静态链接库文件的后缀名通常用 .a 表示,动态链接库的后缀名通常用 .so 表示
    在 Windows 系统中,静态链接库文件的后缀名为 .lib,动态链接库的后缀名为 .dll

  4. GCC 编译器生成可执行文件时,默认情况下会优先使用动态链接库实现链接操作,除非当前系统环境中没有程序文件所需要的动态链接库,GCC 编译器才会选择相应的静态链接库。如果两种都没有(或者 GCC 编译器未找到),则链接失败。

  5. 在 Linux 发行版中,静态链接库和动态链接库通常存放在 /usr/bin 或者 /bin 目录下
    在这里插入图片描述

二、区别

1、静态链接库

  • 静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码,直接复制到程序文件的适当位置,最终生成可执行文件。
  • 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。

优势:
可移植性强,可独立运行,即生成的可执行文件不再需要任何静态库文件的支持就可以独立运行。
可执行程序与库函数再无关系,放在如何环境当中都可以执行。

劣势:
代码冗余、可执行文件的体积大:如果程序文件中多次调用库中的同一功能模块,则该模块代码就会被复制多次,生成的可执行文件中会包含多段完全相同的代码,造成代码的冗余。和使用动态链接库生成的可执行文件相比,静态链接库生成的可执行文件的体积更大。
且如果所使用的静态库发生更新改变,你的程序必须重新编译。
在这里插入图片描述

2、动态链接库

  • 动态链接库,又称为共享链接库。采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件

  • 显然,这样生成的可执行文件是无法独立运行的。采用动态链接库生成的可执行文件运行时,GCC 编译器会将对应的动态链接库一同加载在内存中,由于可执行文件中事先记录了所需功能模块的位置信息,所以在现有动态链接库的支持下,也可以成功运行。

  • 如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译,可能是一个很小的改动,却导致整个程序重新下载,全量更新。

  • 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
    不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。

优势:
生成的执行文件文件体积小,因为可执行文件中记录的是功能模块的地址,真正的实现代码会在程序运行时被载入内存,即便功能模块被调用多次,使用的都是同一份实现代码(这也是将动态链接库称为共享链接库的原因)。
动态库的改变并不影响你的程序,所以动态函数库升级比较方便。
劣势:
可移植性差,无法独立运行,必须借助相应的库文件。
在这里插入图片描述

https://blog.csdn.net/oqqHuTu12345678/article/details/125083174

https://www.bilibili.com/read/cv15423597/

https://blog.csdn.net/breakpoints_/article/details/116166379

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐