什么是库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序员都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

库有两种:静态库(.a,.lib)和动态库(.so,.all)。

所谓静态,动态是指链接。

回顾一下,将一整个程序编译成可执行程序的步骤:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a693a678ff1e4a238fc++动态库与静态库

静态库

之所以称为静态库,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式为静态链接。

静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定与.o文件格式相似。其实静态库可以简单看成是一组目标文件.o/.obj的集合。

静态库特点总结:

  • 静态库对函数库的链接是放在编译时期完成的。
  • 程序在运行是与函数再无瓜葛,移植方便。
  • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
    创建静态库过程如下:
    c++动态库与静态库
    VS工程下设置静态库的步骤:
    c++动态库与静态库

使用静态库的三种方法:

方法1

工程“属性面板”,“通用属性”, “框架和引用”,”添加引用”,将显示“添加引用”对话框。 “项目”选项卡列出了当前解决方案中的各个项目以及可以引用的所有库。
c++动态库与静态库
选择了某个库,必须修改包含目录路径。打开工程“属性面板”,”配置属性”, “C/C++,常规”,在“附加包含目录”属性值中,键入头文件所在目录的路径或浏览至该目录。
c++动态库与静态库

如果引用的静态库不是在同一解决方案下的子工程,而是使用第三方提供的静态库lib和头文件,上面的方法设置不了。还有2中方法设置都可行。

方法2

打开工程“属性面板”,”配置属性”, “链接器”,”命令行”,输入静态库的完整路径即可。
c++动态库与静态库
方法3:

  • “属性面板”,”配置属性”, “链接器”,”常规”,附加依赖库目录中输入,静态库所在目录;
  • “属性面板”,”配置属性”,“链接器”,”输入”,附加依赖库中输入静态库名。
    c++动态库与静态库c++动态库与静态库

动态库

通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?

为什么需要动态库,其实也是静态库的特点导致。

  • 空间浪费是静态库的一个问题。
    c++动态库与静态库

  • 另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。

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

动态库特点总结:

  • 动态库把对一些库函数的链接载入推迟到程序运行的时期。
  • 可以实现进程之间的资源共享。(因此动态库也称为共享库)
  • 将一些程序升级变得简单。 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

动态库的设置与静态库的设置一样。
c++动态库与静态库

动态库的使用与静态库的使用基本相同。这里不再赘述。

总结

二者的不同点在于代码被载入的时刻不同。

  • 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
  • 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。