我经常听到术语"静态链接"和"动态链接",通常是指用以下语言编写的代码C,C或者C

答案

从源代码(您编写的内容)到可执行代码(您运行的内容)有两个阶段(在大多数情况下,不考虑解释代码)。

第一个是编译,将源代码转换为目标模块。

第二个是链接,它将目标模块组合在一起形成可执行文件。

其中的区别在于,允许将第三方库包含在您的可执行文件中,而无需查看其源代码(例如用于数据库访问、网络通信和图形用户界面的库),或者以不同语言编译代码(

当你静态地将文件链接到可执行文件,该文件的内容包含在链接时。

当你链接时动态地 ,指向正在链接的文件的指针(例如文件的文件名)包含在可执行文件中,并且在链接时不包含所述文件的内容。跑步这些动态链接文件被购买到可执行文件中,并且它们仅被购买到可执行文件的内存中副本中,而不是磁盘上的副本中。

它基本上是一种延迟链接的方法。更多的延迟方法(在某些系统上称为后期绑定),在您实际尝试调用其中的函数之前不会引入动态链接文件。

静态链接文件在链接时被"锁定"到可执行文件,因此它们永远不会改变。

这允许更新功能而无需重新链接代码;

这既有好处也有坏处 - 一方面,它允许更轻松的更新和错误修复,另一方面,如果更新不兼容,它可能导致程序停止工作 - 这有时会导致某些人可怕的"DLL 地狱"


作为一个例子 ,让我们看一下用户编译他们的案例main.c文件用于静态和动态链接。

Phase     Static                    Dynamic
--------  ----------------------    ------------------------
          +---------+               +---------+
          | main.c  |               | main.c  |
          +---------+               +---------+
Compile........|.........................|...................
          +---------+ +---------+   +---------+ +--------+
          | main.o  | | crtlib  |   | main.o  | | crtimp |
          +---------+ +---------+   +---------+ +--------+
Link...........|..........|..............|...........|.......
               |          |              +-----------+
               |          |              |
          +---------+     |         +---------+ +--------+
          |  main   |-----+         |  main   | | crtdll |
          +---------+               +---------+ +--------+
Load/Run.......|.........................|..........|........
          +---------+               +---------+     |
          | main in |               | main in |-----+
          | memory  |               | memory  |
          +---------+               +---------+

您可以在静态情况下看到主程序和 C 运行时库在链接时链接在一起(由开发人员)。

在动态情况下,主程序与 C 运行时导入库链接(声明动态库中的内容但实际上并不定义它)。

然后,在运行时,操作系统加载程序将主程序与 C 运行时 DLL(动态链接库或共享库或其他术语)进行后期链接。

C 运行时的所有者可以随时放入新的 DLL 以提供更新或错误修复。

来自: stackoverflow.com