我正在构建一个简单的游戏引擎和一个游戏。这个想法是在引擎中实现大部分功能和基本类层次结构,应该是一个 exe,然后有一个 dll 来实现给定引擎提供的工具的特定游戏。类似于 ID 引擎,例如 idTech4 .
然后引擎将加载 dll,获取游戏实例,将游戏指针指向游戏所需的任何函数和数据结构,并调用诸如 game->update();
之类的方法。在游戏实例上。到现在为止还挺好。
我想在引擎中实现诸如Entity、Transform、Vector3等基本类之类的东西。然后在游戏中我想要的是例如从实体派生我的角色。class Character : public engine::Entity {...};
像这样的东西编译得很好,因为我包含了来自引擎的头文件,但它们没有链接,因为我不使用 obj 文件,也不使用引擎中的 cpp 文件。我知道为什么这不起作用。据我所知,我的(合理的)选择是:
我不想要这个,因为它会增加编译时间、二进制大小等。
这会起作用,但是 库 文件意味着我在 exe(引擎)和 dll(游戏)中都编译(链接)了相同的类 - 这看起来很草率。
DLL 会工作,但我需要对引擎和游戏做的所有导出和进口工作似乎都做了很多。
也可能是最重要的 lib 和 dll 方法都有一个共同的问题,那就是在开发过程中,由于类层次结构可能会发生很大变化等,我最终可能会在它们之间移动各种类。
我的问题是,还有其他方法可以解决这个问题吗?对我来说,这似乎是一个非常有用的功能,可以在 dll 中使用 exe 中的类层次结构。我什至尝试了非常愚蠢的事情,例如让链接器使用引擎编译期间生成的 .obj 文件,但除非我一一指定所有 .obj 文件(我使用的是 Visual Studio 2017),否则它不起作用。
我不想放弃这种设计的模块化。
编辑 :由于 dll 是特定于平台的,让我们考虑 Windows(尽管我猜其他平台会类似)。
最佳答案
听起来您想利用动态加载,但我认为您可能会以错误的方式翻转事情。 exe通常有游戏代码和 .dll 具有游戏引擎逻辑和类。您加载 .dll 在 .exe 代码并使用引擎注册不同的东西,以便您的游戏代码得到更新和渲染。
我现在正在考虑是否有办法翻转它,但它需要在游戏设计逻辑中进行范式转换,其中游戏仅向游戏引擎或其他东西提供更新和渲染功能。这确实是您可以依赖的全部,因为引擎必须足够通用才能处理游戏。
如果我想到任何突破性的东西,我会在这里发布,但同时这里有一些关于动态加载的信息,可以帮助您入门。 https://en.wikipedia.org/wiki/Dynamic_loading
关于c++ - 如何使用 dll 中的 exe 实现的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43660889/