为什么 DLL 与程序捆绑在一起而不是全球化?

问题描述

据我所知,DLL“动态链接库”旨在由许多不同的程序共享,与静态链接库相反,静态链接库自然不会作为单个文件出现,而是进入最终可执行文件的“内部”。

如果这是真的,为什么 DLL(即使是最常见的,例如 Microsoft VC++ 运行时库)与程序捆绑在一起而不包含在已知的系统文件夹中?或者,在这些库在程序上下文之外没有用的情况下,它们为什么不静态链接

据我所知,这不会发生在类 Unix 系统上,在那里我总是遇到以我刚刚描述的方式引用共享库的自包含程序,这感觉就像一个真正的“正确的方法”使用动态链接

解决方法

DLL“动态链接库”旨在由许多不同的程序共享

最初,这是 DLL 的唯一目的。

但它们已经发展到服务于第二个目的:用定义的接口表示一个独立的代码和数据单元。在这方面,它们与 UNIX 共享库非常不同:DLL 不允许符号插入(无需付出太多努力)。

为什么 DLL(即使是最常见的,例如 Microsoft VC++ 运行时库)与程序捆绑在一起而不包含在已知的系统文件夹中?

他们曾经是。这曾经是 DLL hell 的主要原因。

然后 Microsoft 决定磁盘空间(和下载带宽)变得如此便宜,只需将程序测试过的 DLL 集与程序本身一起发布就更容易了,而不必担心向后和向前兼容性。

如果这些库在程序上下文之外没有用,为什么它们不静态链接?

因为程序和 DLL 是由不相关的实体独立生成的。

您可能会问:为什么 DLL 提供程序不简单地提供存档库?但是存档库显然不是自包含的——链接到这样的库要求您使用匹配的编译器和所有标头,这要安全得多。