我已经看到有很多不同的原因可以隐式和显式地链接.DLL。我目前正在使用Visual Studio 2015和C ++与SFML。
隐式: - 好的一面: 您可以访问.DLL标题(.h)并知道它包含的函数。 它更容易链接和使用。 不容易出错。 似乎是最常用的做法。
-Bad方面: 绝对需要.lib,.h和.dll文件进行链接。 由于文件更多,占用的磁盘空间更多。
显式: - 好的一面: 由于只需要.dll,所以占用的磁盘空间更少。
-Bad方面: 由于可能使用dll可能没有的功能以及正确加载它而容易出错。 没有办法知道dll包含的函数,因为你没有标题。
1:我听说过明确的联系是一种不好的做法。这是对的吗?
2:我是否应该主要关注隐含的链接?
3:显然,我对DLL的了解很少,有没有更好的和坏的方面我没有看到关于dll的隐式和显式方式?
4:由于我打算制作游戏,将精灵表放入dll以使用指针加载纹理一次是不错的做法?
答案 0 :(得分:0)
您可以删除“减少磁盘空间”点。只有开发人员的机器才需要* .lib。在安装程序中,两种情况下都只需要DLL。
这取决于用例。有些情况下,显式链接(通常称为动态加载)是唯一的方法,例如当这些DLL实现用户提供的插件时。
对于针对 kids 大量缺乏经验的用户的游戏或其他桌面应用,我建议不要使用DLL。静态链接所有代码。它不仅会使您的应用程序变小(链接器会丢弃您未调用的那些库中的任何代码),这也将消除一类错误。这当然也适用于C运行时库(msvcrt.dll)。
_4。我不会这样做。从逻辑上讲,精灵表是数据,而不是代码。无论您如何静态或动态加载DLL,都不应将其放在DLL中。而是从文件加载该数据。如果您在加载游戏或关卡时只需要该数据,请使用ReadFile API。如果您在游戏运行时不断地从该精灵表中读取,您可以将该完整数据文件映射到您的进程的地址空间,请参阅CreateFileMapping和MapViewOfFile API(内部,DLL加载使用此方法)。请注意32位应用程序的地址空间很少。