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

Why are DLLs bundled with programs instead of being globalised?

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

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

据我所知,这不会发生在类 Unix 系统上,在类 Unix 系统上我总是遇到独立的程序,它们以我刚才描述的方式引用共享库,感觉就像实际上是使用动态链接的“正确方法”。

DLLs "Dynamic Link Libraries" are meant to be shared by many different programs

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

但它们已经发展为服务于第二个目的:表示具有已定义接口的独立代码和数据单元。在这方面,它们与 UNIX 共享库有很大不同:DLL 不允许符号插入(不费吹灰之力)。

why are DLLs (even the most common ones, such as the Microsoft VC++ Runtime Library) bundled with programs and not contained in a known system folder?

他们曾经是。这曾经是 DLL hell.

的主要原因

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

in the case that such libraries are not useful outside the program context, why aren't they linked statically?

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

您可能会问:为什么 DLL 提供程序不直接提供存档库?但是存档库明显不是独立的——链接到这样的库需要你使用匹配的编译器和所有的头文件,这是很多更难做到安全。