库是写好的现有的,成熟的,可以复用的代码。现实中每个程序员都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
库有两种:静态库(.a,.lib)和动态库(.so,.all)。
所谓静态,动态是指链接。
回顾一下,将一整个程序编译成可执行程序的步骤:

之所以称为静态库,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式为静态链接。
静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定与.o文件格式相似。其实静态库可以简单看成是一组目标文件.o/.obj的集合。
静态库特点总结:

使用静态库的三种方法:
方法1:
工程“属性面板”,“通用属性”, “框架和引用”,”添加引用”,将显示“添加引用”对话框。 “项目”选项卡列出了当前解决方案中的各个项目以及可以引用的所有库。
选择了某个库,必须修改包含目录路径。打开工程“属性面板”,”配置属性”, “C/C++,常规”,在“附加包含目录”属性值中,键入头文件所在目录的路径或浏览至该目录。
如果引用的静态库不是在同一解决方案下的子工程,而是使用第三方提供的静态库lib和头文件,上面的方法设置不了。还有2中方法设置都可行。
方法2:
打开工程“属性面板”,”配置属性”, “链接器”,”命令行”,输入静态库的完整路径即可。
方法3:

通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?
为什么需要动态库,其实也是静态库的特点导致。
空间浪费是静态库的一个问题。
另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
动态库特点总结:
动态库的设置与静态库的设置一样。
动态库的使用与静态库的使用基本相同。这里不再赘述。
二者的不同点在于代码被载入的时刻不同。
下一个:Vuex大全