【问题标题】:Which is the best practice between implicit linking and explicit linking of DLL这是DLL的隐式链接和显式链接之间的最佳实践
【发布时间】:2016-10-27 15:32:30
【问题描述】:

我发现隐式和显式链接 .DLL 有很多不同的原因。我目前正在使用带有 SFML 的 Visual Studio 2015 和 C++。

隐式: -好的一面: 您可以访问 .DLL 标头 (.h) 并知道它包含的函数。 它更容易链接和使用。 不太容易出错。 似乎是最常用的做法。

-坏的一面: 绝对需要.lib、.h 和.dll 文件来链接。 由于文件更多,占用更多磁盘空间。

显式: -好的一面: 由于只需要 .dll,占用更少的磁盘空间。

-坏的一面: 由于可能使用 dll 可能没有的功能以及正确加载它,因此容易出错。 由于您没有标头,因此无法知道 dll 包含的功能。

1:我听说显式链接是一种不好的做法。这是正确的吗?

2:我应该主要关注隐式链接吗?

3:显然,我对 DLL 的了解很少,关于链接 dll 的隐式和显式方式,我没有看到更多好的和坏的方面吗?

4:由于我打算制作游戏,将sprite-sheet放入dll中以使用指针加载一次纹理是一个好习惯吗?

【问题讨论】:

  • 你弄错了,真的最好实际尝试一下。磁盘空间没有区别,在这两种情况下您只需要部署 DLL。显式需要在您的开发机器上更多 空间,您无法绕过声明函数指针类型和挖掘导出的代码的需要。很难维护的非常痛苦的代码,尤其是对于像 SFML 这样的大型库。您只使用显式因为 DLL 可能没有导出。 SFML 永远不需要,因为复制 DLL 的是您。

标签: c++ dll sfml


【解决方案1】:

您可以删除“占用更少磁盘空间”这一点。 *.lib 仅在开发人员的机器上是必需的。在安装程序中,两种情况都只需要 DLL。

  1. 这取决于用例。在某些情况下,显式链接(通常称为动态加载)是唯一的方法,例如当这些 DLL 实现用户提供的插件时。

  2. 对于面向孩子 大量缺乏经验的用户的游戏或其他桌面应用程序,我建议完全不要使用 DLL。静态链接所有代码。它不仅使您的应用程序更小(链接器将丢弃您未调用的那些库中的任何代码),这还将消除一类错误。这当然也适用于 C 运行时库 (msvcrt.dll)。

_4。我不会那样做的。从逻辑上讲,精灵表是数据,而不是代码。无论您如何加载 DLL(静态或动态),都不应将其放在 DLL 中。相反,从文件中加载该数据。如果您在加载游戏或关卡时只需要这些数据,请使用 ReadFile API。如果您在游戏运行时不断地读取该精灵表,您可以将该完整的数据文件映射到您的进程的地址空间,请参阅 CreateFileMapping 和 MapViewOfFile API(在内部,DLL 加载使用此方法)。请注意 32 位应用程序地址空间稀缺。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多