Я создаю простой игровой движок и игру в нем. Идея состоит в том, чтобы большая часть функциональности и базовая иерархия классов были реализованы в движке, который должен быть исполняемым файлом, а затем иметь dll, которая будет реализовывать конкретную игру с учетом инструментов, предоставляемых движком. Подобно механизмам id, таким как idTech4.
Затем движок загрузит dll, получит экземпляр игры, предоставит игре указатели на любые функции и структуры данных, которые нужны игре, и вызовет такие методы, как game->update();
для экземпляра игры. Все идет нормально.
Я хотел бы, чтобы в движке были реализованы такие вещи, как базовые классы, такие как Entity, Transform, Vector3 и т. д. Затем в игре я хочу, например, вывести своего персонажа из Entity.
class Character : public engine::Entity {...};
Подобные вещи компилируются нормально, так как я включаю заголовки из движка, но они не связываются, так как я не использую файлы obj и файлы cpp, формирующие движок. Я знаю, почему это не работает. Насколько я знаю, мои (разумные) варианты:
- Сделайте эти классы только заголовком - таким образом он всегда будет компилироваться везде.
Я не хочу этого, так как это увеличит время компиляции, размер двоичного файла и т.д.
- Поместите общую функциональность в библиотеку или dll.
Это будет работать, но файл lib будет означать, что у меня есть одни и те же классы, скомпилированные (связанные) как в exe (движок), так и в dll (игра) - это кажется небрежным. Dll будет работать, но похоже, что мне придется проделать много работы со всеми экспортами и импортами как для движка, так и для игры. Также, вероятно, самое главное, подход lib и dll имеет общую проблему, которая заключается в том, что во время разработки я могу в конечном итоге перемещать различные классы из них и в них, поскольку иерархия классов может сильно измениться и т. д.
Мой вопрос в том, есть ли другой способ обойти это? Для меня это кажется довольно полезной функцией иметь иерархию классов в exe, которую можно использовать из dll. Я пробовал даже очень глупые вещи, такие как заставить компоновщик использовать файлы .obj, сгенерированные во время компиляции движка, но это не сработало, если я не указывал все файлы .obj один за другим. (Я использую Visual Studio 2017).
Я не хочу отказываться от модульности этой конструкции.
Редактировать: поскольку dll зависят от платформы, давайте рассмотрим Windows (хотя я думаю, что другие платформы будут похожими).