我经常听到术语"静态链接"和"动态链接",通常是指用以下语言编写的代码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 以提供更新或错误修复。