Windows 仍然使用 DLL,而 Mac 程序似乎根本不使用 DLL。使用这两种技术有好处还是坏处?
如果一个程序安装包含它需要的所有 DLL 以使其 100% 正常工作,它是否与静态链接所有库相同?
Windows 仍然使用 DLL,而 Mac 程序似乎根本不使用 DLL。使用这两种技术有好处还是坏处?
如果一个程序安装包含它需要的所有 DLL 以使其 100% 正常工作,它是否与静态链接所有库相同?
MacOS X 和其他风格的 Unix 一样,使用共享库,这只是 DLL 的另一种形式。
是的,两者都是有利的,因为 DLL 或共享库代码可以在多个进程之间共享。它通过操作系统加载 DLL 或共享库并将其映射到使用它的进程的虚拟地址空间来实现这一点。
Windows 仍然使用 DLL,而 Mac 程序似乎根本不使用 DLL。它们是使用这两种技术的好处还是坏处?
任何形式的模块化都是好的,因为它使更新软件更容易,即如果程序中的错误已修复,您不必更新整个程序二进制文件。如果bug出现在某些dll中,只需要更新dll即可。
imo 唯一的缺点是您在程序开发中引入了另一种复杂性,例如,如果 dll 是 ac 或 c++ dll,不同的调用约定等。
如果一个程序安装包括它需要的所有 DLL,它是否与静态链接所有库一样?
或多或少是的。取决于您是否在假设静态链接的 dll 中调用函数。dll 也可以是一个“独立的”动态库,您只能通过 LoadLibrary() 和 GetProcAddress() 等访问。
共享库(Windows 上的 DLL 或 Unix 上的 .so)的一大优势是您可以分别重建库及其使用者,而使用静态库您必须重建库然后重新链接所有使用者,这在 Unix 系统上非常慢而且在 Windows 上不是很快。
MacOS 软件也使用“dll”,只是名称不同(共享库)。
如果您有想要在软件的不同组件中重用的代码,那么 Dll 就很有意义。大多数情况下,这在大型软件项目中是有意义的。
当不需要代码重用时,静态链接对于小型单组件应用程序很有意义。它简化了分发,因为您的组件没有外部依赖项。
在 Windows 上,您必须使用动态加载的库,因为 GDI 和 USER 库只能作为 DLL 使用。您不能使用不涉及动态加载的协议将其中任何一个链接或与他们交谈。
在其他操作系统上,您无论如何都希望对复杂的应用程序使用动态加载,否则您的二进制文件会无缘无故地膨胀,并且从长远来看,它增加了您的应用程序与系统不兼容的可能性(但是,在短期内是静态的链接可以在一定程度上保护您免受库中微小的破坏性更改)。而且您不能在依赖它们的操作系统上链接专有库。
除了内存/磁盘空间使用之外,使用共享库的另一个重要优点是库的更新将被系统上使用该库的所有程序自动获取。
当 InfoZIP ZIP 库中存在安全漏洞时,对 DLL/.so 的更新会自动使所有使用这些库的软件安全。必须重新编译静态链接的软件。
Windows 仍然使用 DLL,而 Mac 程序似乎根本不使用 DLL。它们是使用这两种技术的好处还是坏处?
两者都使用共享库,只是使用不同的名称。
如果一个程序安装包含它需要的所有 DLL 以使其 100% 正常工作,它是否与静态链接所有库相同?
有些。当您将库静态链接到程序时,您将获得一个非常大的文件,使用 DLL,您将拥有许多文件。
静态链接的文件不需要“解析共享库”步骤(在程序加载时发生)。很久以前,加载静态程序意味着首先将整个程序加载到 RAM 中,然后发生“解析共享库”步骤。今天,只有实际执行的程序部分是按需加载的。因此,使用静态程序,您无需解析 DLL。使用 DLL,您不需要一次全部加载它们。所以在性能方面,它们应该是相当的。
这留下了“DLL地狱”。Windows 上的许多程序都带有它们需要的所有 DLL,并将它们写入 Windows 目录。最终结果是最后安装的程序可以正常工作,而其他所有程序都可能被破坏。但有一个简单的解决方法:将 DLL 安装到与 EXE 相同的目录中。Windows 将首先搜索当前目录,然后搜索各种 Windows 路径。这样,你会浪费一点磁盘空间,但你的程序可以工作,更重要的是,你不会破坏其他任何东西。
有人可能会争辩说,您不应该在 Windows 目录中安装已经存在(具有相同版本)的 DLL,但随后,您又容易受到一些不良应用程序的攻击,这些应用程序会用破坏您脖子的东西覆盖您需要的版本。缺点是您必须自己为您的应用分发安全修复程序;你不能依赖 Windows 更新或类似的东西来保护你的代码。这是一个紧张的地方;破解者从安全问题中赚了很多钱,当有人窃取他们的银行数据时,人们不会喜欢你,因为你没有尽快发布安全修复程序。
如果您计划在很多年(例如 20 年)内非常紧密地支持您的应用程序,那么将所有 DLL 安装在程序目录中是适合您的。如果没有,则编写代码检查是否安装了所有 DLL 的合适版本并告知用户,以便他们知道您的应用程序突然开始崩溃的原因。
是的,请看这段文字:
动态链接具有以下优点:
节省内存并减少交换。许多进程可以同时使用单个 DLL,在内存中共享 DLL 的单个副本。相反,对于使用静态链接库构建的每个应用程序,Windows 都必须将库代码的副本加载到内存中。
节省磁盘空间。许多应用程序可以共享磁盘上 DLL 的单个副本。相比之下,使用静态链接库构建的每个应用程序都将库代码链接到其可执行映像中作为单独的副本。
升级到 DLL 更容易。当 DLL 中的函数发生变化时,只要函数参数和返回值不变,使用它们的应用程序就不需要重新编译或重新链接。相反,静态链接的目标代码要求在功能更改时重新链接应用程序。
提供售后支持。例如,可以修改显示驱动程序 DLL 以支持应用程序发布时不可用的显示。
支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用同一个 DLL 函数。程序和 DLL 函数必须在以下方面兼容:函数期望其参数被压入堆栈的顺序,函数或应用程序是否负责清理堆栈,以及是否传递任何参数在寄存器中。
提供一种机制来扩展 MFC 库类。您可以从现有的 MFC 类派生类并将它们放置在 MFC 扩展 DLL 中以供 MFC 应用程序使用。
简化国际版本的创建。通过将资源放置在 DLL 中,可以更轻松地创建应用程序的国际版本。您可以将应用程序的每个语言版本的字符串放在单独的资源 DLL 中,并让不同的语言版本加载相应的资源。
使用 DLL 的一个潜在缺点是应用程序不是独立的。这取决于是否存在单独的 DLL 模块。
从我的角度来看,共享组件具有一些有时被视为缺点的优点。
所以我认为使用共享组件将有助于软件更好地组织。