C++17游戏引擎:如何通过CMake自动生成含entities目录所有头文件的entitylist.h?
自动生成entitylist.h的CMake实现方案
完全可以通过CMake在构建阶段自动完成这个需求,不需要手动维护entitylist.h。下面是针对你的C++17、Visual Studio环境的具体实现步骤:
1. 准备模板文件
把原来手动维护的entitylist.h替换成模板文件entitylist.h.in,内容如下(可保留必要的注释和预处理指令):
// 此文件由CMake自动生成,请勿手动编辑 #pragma once @ENTITY_INCLUDES@
2. 在CMakeLists.txt中添加自动生成逻辑
在项目的CMake脚本中加入以下代码,实现扫描头文件、生成include语句并输出最终的entitylist.h:
# 1. 扫描entities目录下的所有头文件(可根据需求调整路径和扫描规则) file(GLOB_RECURSE ENTITY_HEADERS "${CMAKE_SOURCE_DIR}/entities/*.h") # 2. 生成所有头文件的#include语句 set(ENTITY_INCLUDES "") foreach(HEADER ${ENTITY_HEADERS}) # 计算头文件相对于源码根目录的路径,保证include路径正确 file(RELATIVE_PATH REL_HEADER "${CMAKE_SOURCE_DIR}" ${HEADER}) string(APPEND ENTITY_INCLUDES "#include \"${REL_HEADER}\"\n") endforeach() # 3. 从模板生成最终的entitylist.h,输出到构建目录避免污染源码 configure_file( "${CMAKE_SOURCE_DIR}/entitylist.h.in" "${CMAKE_BINARY_DIR}/generated/entitylist.h" @ONLY ) # 4. 将生成文件所在目录添加到项目的include路径 target_include_directories(你的游戏引擎/编辑器目标名 PRIVATE "${CMAKE_BINARY_DIR}/generated")
3. 处理文件更新依赖
为了保证当entities目录下添加/删除头文件时,CMake会自动重新生成entitylist.h,可以添加自定义目标管理依赖:
add_custom_target(generate_entitylist DEPENDS ${ENTITY_HEADERS} ) # 让项目目标依赖这个生成任务,确保构建前先更新entitylist.h add_dependencies(你的游戏引擎/编辑器目标名 generate_entitylist)
4. 可选:过滤不需要包含的头文件
如果entities目录下有内部用的头文件不需要被关卡编辑器识别,可以在扫描时排除:
file(GLOB_RECURSE ENTITY_HEADERS "${CMAKE_SOURCE_DIR}/entities/*.h" EXCLUDE "${CMAKE_SOURCE_DIR}/entities/internal/*.h" # 排除internal子目录的文件 )
使用方式
现在用户添加自定义实体时,只需要将Foo.h放入entities目录,直接构建项目即可——CMake会自动扫描到新文件并更新entitylist.h的include语句,无需任何手动编辑操作。
内容的提问来源于stack exchange,提问作者eflwap
相关产品推荐
相关产品推荐

