我正在构建一个简单的游戏引擎和游戏。我们的想法是在引擎中实现大部分功能和基本类层次结构,这应该是一个exe,然后有一个dll,它将根据引擎提供的工具实现特定的游戏。与id引擎类似,例如idTech4。
然后引擎将加载dll,获取游戏实例,为游戏需要的任何函数和数据结构提供游戏指针,并在游戏实例上调用game->update();
等方法。到目前为止一切都很好。
我想在引擎中实现像Entity,Transform,Vector3等基本类。然后在游戏中我想要的是例如从实体派生我的角色。
class Character : public engine::Entity {...};
这样的事情编译得很好,因为我包含了引擎的标题,但它们没有链接,因为我不使用obj文件,也没有cpp文件构成引擎。我知道为什么这不起作用。据我所知,我的(合理)选项是:
我不希望这样,因为它会增加编译时间,二进制大小等。
这样可行,但是 lib 文件意味着我在exe(引擎)和dll(游戏)中编译(链接)了相同的类 - 这看起来很草率。 Dll 会起作用,但对于我需要对引擎和游戏进行的所有导出和导入似乎都有很多工作要做。 也许最重要的是 lib和dll方法都有共同的问题,那就是在开发过程中我可能最终会将各种类很多地移到它们身上,因为类层次结构可能会发生很大变化等等。
我的问题是,还有另一种解决方法吗?对我来说,这似乎是一个非常有用的功能,可以从dll中使用exe的类层次结构。我尝试过甚至非常愚蠢的事情,例如让链接器使用引擎编译期间生成的 .obj 文件,但除非我逐个指定所有 .obj 文件,否则它不起作用(我使用的是Visual Studio 2017)。
我不想放弃这种设计的模块化。
编辑:由于dll是特定于平台的,我们考虑使用Windows(虽然我猜其他平台也会类似)。
答案 0 :(得分:1)
我现在正在思考如果有一种方法可以翻转它,但是它需要在游戏设计逻辑中进行范式转换,其中游戏只为游戏引擎提供更新和渲染功能或其他东西。这真的是你所能依赖的,因为引擎必须足够通用才能处理游戏。
如果我想到任何突破性的话,我会在这里发布,但同时在这里有一些关于动态加载的信息可以帮助你入门。 https://en.wikipedia.org/wiki/Dynamic_loading
答案 1 :(得分:0)
不,它不会。 这些类将在共享库(Linux上的.so,Windows上的.dll,mac上的.dylib)上编译和提供,并且您的可执行文件将从共享库中调用 特定方法。它不会再次在您的可执行文件中编译。Put the common functionality into a lib or a dll.
这样可行,但是lib文件意味着我也一样 在exe和dll中编译(链接)的类
看一下所有框架或C ++中的库实现: