gpt4 book ai didi

c# - 'statically linked' 和 'dynamically linked' 是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 11:27:05 26 4
gpt4 key购买 nike

我经常听到“静态链接”和“动态链接”这两个术语,通常指的是用 C 编写的代码。 , C++C# .它们是什么,它们到底在说什么,它们在链接什么?

最佳答案

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

首先是将源代码转换为目标模块的编译。

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

区别在于,除其他外,允许第​​三方库包含在您的可执行文件中,而您不会看到它们的源代码(例如用于数据库访问、网络通信和图形用户界面的库),或者用于在不同的语言(例如 C 和汇编代码),然后将它们链接在一起。

当您静态将文件链接到可执行文件时,该文件的内容会在链接时包含。换句话说,文件的内容被物理插入到您将要运行的可执行文件中。

当您动态链接时,指向被链接文件的指针(例如文件的文件名)包含在可执行文件中,并且该文件的内容不包含在链接中时间。只有当您稍后运行可执行文件时,这些动态链接的文件才会被购买,并且它们只会被购买到可执行文件的内存拷贝中,而不是磁盘上的那个。

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

静态链接文件在链接时被“锁定”到可执行文件,因此它们永远不会改变。可执行文件引用的动态链接文件只需替换磁盘上的文件即可更改。

这允许更新功能而无需重新链接代码;每次运行时加载器都会重新链接。

这有好有坏 - 一方面,它允许更轻松的更新和错误修复,另一方面,如果更新不兼容,它可能导致程序停止工作 - 这有时是可怕的“DLL hell ”的原因有人提到,如果将动态链接库替换为不兼容的库,应用程序可能会被破坏(顺便说一下,这样做的开发人员应该会受到追捕和严厉惩罚)。


作为一个示例,让我们看看用户编译他们的 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 以提供更新或错误修复。如前所述,这既有优点也有缺点。

关于c# - 'statically linked' 和 'dynamically linked' 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/311882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com