链接 & 库


链接

静态链接 与 动态链接

静态链接

是在生成可执行程序的时候就把库中的内容加入到程序中。

动态链接

把链接这个过程推迟到了运行时再进行。

  • 载入时动态链接 是在将功能模块读入内存时把动态库中调用到的相关模块的内容载入内存。
  • 运行时动态链接 是在执行程序调用到模块内容时再将动态库中的相应模块载入到内存。

对比

  • 静态链接 代码装载速度快,执行速度略比动态链接库快,但使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费。
  • 动态链接 DLL文件与EXE文件独立,更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性(热更新)因而使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在。

库文件

可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。静态链接库与动态链接库都是共享代码的方式。

Windows的静态库文件扩展名是 .lib,动态库文件扩展名是 .dll (Dynamic-Link Libraries);
Linux的静态库扩展名是 .a,动态库扩展名是 .so (Shared Object)。

静态库 与 动态库

静态库

静态库在程序的链接阶段被复制到了程序中。

动态库

动态库是程序在运行时由系统动态加载到内存中供程序调用。

对比

  • 使用动态库便于模块化更新程序。 可执行文件执行时可以“动态”地引用和卸载这个与可执行文件独立的库文件。
  • 静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

本文章使用limfx的vscode插件快速发布