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

为什么DLL与程序捆绑在一起而不是全球化?,dll,linker,shared-libraries,dynamic-linking,toolchain,Dll,Linker,Shared Libraries,Dynamic Linking,Toolchain,据我所知,DLL“动态链接库”是由许多不同的程序共享的,与静态链接库相反,静态链接库自然不会显示为单个文件,而是放在最终可执行文件的“内部” 如果这是真的,为什么DLL(即使是最常见的DLL,如Microsoft VC++运行库)与程序捆绑在一起,而不包含在已知的系统文件夹中?或者,如果这些库在程序上下文之外没有用处,为什么它们不静态链接 据我所知,这不会发生在类Unix的系统上,在这些系统中,我总是遇到以我刚才描述的方式引用共享库的自包含程序,这感觉像是使用动态链接的一种“正确方式” DLL“

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

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

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

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

最初,这是DLL的唯一用途


但它们已经演变为第二个用途:用定义的接口表示一个自包含的代码和数据单元。在这方面,它们与UNIX共享库非常不同:DLL不允许符号插入(无需付出很大努力)

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

过去是这样。而这曾经是造成这场灾难的主要原因

然后,微软决定磁盘空间(和下载带宽)变得非常便宜,只需将程序本身测试过的DLL集发送出去就更容易了,而且不必太担心向后和向前的兼容性

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

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


您可能会问:为什么DLL提供程序不简单地提供一个归档库?但归档库显然不是自包含的——针对此类库的链接需要使用匹配的编译器和所有头,这要安全地完成要困难得多。

我要补充的唯一一个角度是,对于任何具有多个可执行文件的大型应用程序,静态vs dll可能是一个微妙的内部决策。例如,我们有一个名为qip的库,它是静态的。。。每个链接到它的dll/exe都有自己的副本。起初这是一个特性,但是后来我发现自己在追踪一个由两个完整的C++基础类的代码副本引起的错误。所以我把它变成了qip.dll。但我肯定不会把它放在system32中。“DLL不允许符号插入(没有很大的努力)”。开始哭泣,唱海上小屋