【问题标题】:Link 1st-party library with CMake将第一方库与 CMake 链接
【发布时间】:2021-11-30 19:19:06
【问题描述】:

我想用 C++ 制作游戏,我的目标是将游戏引擎代码与游戏逻辑代码隔离开来,这样我就可以重用一些逻辑并拥有单独的 git 存储库:

+-- MyPersonalProjects
|  +-- TheEngine (library)
|  |  +-- src...
|  +-- TheGame (depends on TheEngine)
|  |  +-- src...
|  +-- AnotherGame (depends on TheEngine)
|  |  +-- src...

我是 C++ 新手(来自 Unity C#),所以构建系统仍然是我想要弄清楚的东西。

使用 CMake,我将如何将引擎链接到游戏?使用相对路径?将.a 文件复制到每个引擎?还是有更好的方法来解决这个问题?


IDE: CLion for Mac

【问题讨论】:

  • 你在工作目录中创建.exe,然后将其复制到根目录

标签: c++ macos cmake game-engine clion


【解决方案1】:

如果您只有一个引擎和一堆游戏,那么将引擎作为 git 子模块 包含到每个游戏中,然后从每个游戏内部调用引擎上的 add_subdirectory 就足够了。对于草图:

cmake_minimum_required(VERSION 3.21)
project(Game)

add_subdirectory(Engine)

# ...

target_link_libraries(Game PRIVATE Engine::Engine)

这种方法的主要优点是易于使用和维护。无需编写安装规则或学习包管理器。主要缺点是您必须等待为每个游戏构建整个引擎。 CCache 是一种部分缓解措施(不适用于 Windows,可能会因为愚蠢的原因而失败)。

另一个缺点是它不能扩展。 1 对 N 的依赖图很容易跟踪。任意依赖 DAG 不是。随着您的扩展和构建时间的增加,与包管理器(如 vcpkg(或 Conan)集成)的价值支撑显着增加。

【讨论】:

  • 我明白了,我以前从未使用过 git 子模块,但这听起来很有用。我得调查一下他们。因此,必须在构建游戏之前对引擎进行任何更改?
  • 是的,您必须通过拉入子模块来故意升级引擎。有些人可能认为这是一种优势,另一些人可能认为这是开销。这取决于引擎更换的频率。
  • git 子模块是否与包管理器搭配得很好?你提到柯南。我可以将它用于公共第三方库并将 git 子模块用于我自己的私有库吗?
  • 你可以...柯南和 vcpkg 都提供与私有存储库集成的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多