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