在静态库和动态库/插件之间进行选择?

Posted

技术标签:

【中文标题】在静态库和动态库/插件之间进行选择?【英文标题】:Choosing between static libs and dynamic libs/plugins? 【发布时间】:2010-02-12 00:19:05 【问题描述】:

在过去 6 个月左右的时间里,我一直在一个小型测试游戏中拼凑一些东西,现在一切都在一个项目中。我想了解有关创建可重用“引擎”的更多信息,并且我正在尝试找出实现此目的的最佳方法。

静态库显然要快一点,因为它们是在运行时编译而不是在运行时加载的,但这对我来说真的无关紧要。 DLL 相对于静态库的优势似乎相当大。所以我想知道“游戏引擎”的最佳方法/最常用的方法是什么。

我正在使用 Ogre3D(渲染引擎),它支持它加载的 dll 插件,但我想编写我的 dll,我基本上可以在任何地方使用它们。那么我最好的选择是为我的示例引擎的每个部分编写单独的 DLL,例如 sound.dll、gui.dll 等?或者我会更好地通过创建一个大的 dll,被认为是 engine.dll 或其他东西吗?我假设最好的方法是为一般结构编写类似...engine.dll 的东西,然后将其组合成其他 dll,例如声音/gui/input/等。

独立于 Ogre 的插件系统编写我的 dll 会很愚蠢吗?我的声音依赖于 FMOD 库,我的 GUI 依赖于 CEGUI 库,等等。我主要只是想将我的引擎创建到可以轻松使用各个库中我需要的功能的程度。

【问题讨论】:

【参考方案1】:

如果您正在创建 DLL 以实现可重用性,则将其拆分为独立的函数单元是有意义的。因此,如果您有一个通用的声音库,例如播放 wav 文件,如果您认为许多其他程序可能会使用该特定库,则可以将其分离为 sound.dll。同样,对于您认为可以在其他地方重复使用的任何东西。

但是,如果在大多数情况下,只有那些使用您的声音例程的人也将加载您的游戏引擎的其余部分(或大部分)dll,那么我认为拥有这么多独立的库毫无意义。我可以看到拥有 engine.dll 的意义,这样可以从单个引擎创建许多游戏,而不是不必要地拆分其余部分。

【讨论】:

是的,我问的原因是我查看了 Valve 游戏的一些构成,它们有 inputsystem.dll、soundsystem.dll、materialsystem.dll 和其他大约 20 个。不过,我认为只有一个 engine.dll 的想法听起来不错,谢谢!

以上是关于在静态库和动态库/插件之间进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(二五零)动态库和静态库的选择顺序

静态库和动态库同时链接

《C语言杂记》静态库和动态库(Windows版)

《C语言杂记》静态库和动态库(Windows版)

C语言学习笔记--动态库和静态库的使用

动态库和静态库的区别