这是隐式链接和DLL

时间:2016-10-27 15:32:30

标签: c++ dll sfml

我已经看到有很多不同的原因可以隐式和显式地链接.DLL。我目前正在使用Visual Studio 2015和C ++与SFML。

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

-Bad方面:    绝对需要.lib,.h和.dll文件进行链接。    由于文件更多,占用的磁盘空间更多。

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

-Bad方面:    由于可能使用dll可能没有的功能以及正确加载它而容易出错。    没有办法知道dll包含的函数,因为你没有标题。

1:我听说过明确的联系是一种不好的做法。这是对的吗?

2:我是否应该主要关注隐含的链接?

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

4:由于我打算制作游戏,将精灵表放入dll以使用指针加载纹理一次是不错的做法?

1 个答案:

答案 0 :(得分:0)

您可以删除“减少磁盘空间”点。只有开发人员的机器才需要* .lib。在安装程序中,两种情况下都只需要DLL。

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

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

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