使用CMake链接自研第一方C++游戏引擎到游戏项目的方案咨询
CMake 多项目依赖(引擎+游戏)最优配置方案
以下方案均完美适配Mac端CLion环境,按适配你需求的优先级从高到低排序:
1. 使用 FetchContent 模块(最适配独立Git仓库场景)
这是目前最符合你需求的方案,不需要固定本地目录结构,也不需要手动管理库文件,CMake会自动拉取指定版本的引擎代码和游戏一起编译:
- 你只需要在
TheGame/AnotherGame的根目录CMakeLists.txt中加入以下配置:
include(FetchContent) # 声明引擎依赖的Git仓库信息 FetchContent_Declare( TheEngine GIT_REPOSITORY <你的TheEngine仓库Git地址> GIT_TAG <指定要使用的分支名、tag或者commit hash> ) # 拉取并编译引擎 FetchContent_MakeAvailable(TheEngine) # 你的游戏目标配置完成后,直接链接引擎即可 add_executable(TheGame src/main.cpp) target_link_libraries(TheGame PRIVATE TheEngine)
- 优势:
- 自动处理引擎版本绑定,每个游戏可以独立选择使用的引擎版本,不会互相冲突
- 不需要手动管理引擎二进制文件,编译游戏时会自动编译对应版本的引擎
- CLion会自动索引引擎源码,支持直接在引擎代码里打断点、步进调试
- 迁移项目到其他设备时不需要额外调整路径,只要能拉取Git仓库就能正常编译
2. Git子模块 + add_subdirectory(适合需要频繁修改引擎的场景)
如果你日常开发时会同时调整引擎代码和游戏逻辑,不想每次改引擎都提交Git再拉取,可以用这个方案:
- 在每个游戏项目中把
TheEngine添加为Git子模块,存放到项目的extern目录下 - 在游戏的
CMakeLists.txt中添加:
# 相对路径指向子模块中的引擎根目录 add_subdirectory(extern/TheEngine) target_link_libraries(TheGame PRIVATE TheEngine)
- 优势:引擎和游戏的代码修改可以实时生效,不需要额外的发布流程,两个仓库的提交完全独立,符合你独立管理Git仓库的需求。
3. 预编译安装(适合引擎很少改动的场景)
如果你的引擎已经进入稳定阶段,很少需要修改,可以把引擎预编译后安装到本地公共目录,避免每次编译游戏都重复编译引擎:
- 在
TheEngine的CMakeLists.txt中配置好安装规则,将编译产物(.a静态库)、头文件、CMake配置文件统一安装到本地公共目录,比如~/MyPersonalProjects/built_libs/TheEngine - 在游戏的
CMakeLists.txt中直接查找已经安装的引擎:
set(TheEngine_DIR "~/MyPersonalProjects/built_libs/TheEngine/lib/cmake/TheEngine") find_package(TheEngine REQUIRED) target_link_libraries(TheGame PRIVATE TheEngine)
不推荐的做法
- 手动复制
.a文件到每个游戏项目:维护成本极高,每次引擎更新都要手动替换所有游戏的库文件,很容易出现版本不匹配问题,也无法调试引擎源码 - 硬编码绝对路径引用引擎:项目迁移到其他设备或者调整目录结构后直接编译失败,完全不具备可移植性
内容的提问来源于stack exchange,提问作者MrGVSV
相关产品推荐
相关产品推荐

