如何在CMakeLists中动态构建文件路径并生成头文件包含列表?
CMake相关问题解答
1. 如何在CMakeLists中动态构建文件路径字符串?
CMake中动态构建文件路径核心靠变量引用和内置路径处理命令实现,常用方式包括:
- 用
${变量名}直接引用已定义的路径变量 - 通过
file(RELATIVE_PATH)计算相对路径、get_filename_component()提取文件名/目录等命令处理路径 - 字符串拼接直接通过
set(新变量 "${变量1}${变量2}")完成
2. 解决将engine/*下文件写入allheader.h的问题
你的代码错误在于直接把file(RELATIVE_PATH)作为字符串写入文件,没有实际执行该命令获取真实路径。正确做法是先通过命令计算出路径,再将结果写入文件。
修正后的代码示例:
# 先获取engine目录下的所有文件(若已定义ENGINE变量可跳过此步) file(GLOB ENGINE "engine/*") # 先清空allheader.h,避免多次执行CMake重复追加内容 file(WRITE allheader.h "") foreach(file ${ENGINE}) # 计算文件相对于当前源码目录的相对路径,可根据需求调整基准目录 file(RELATIVE_PATH rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${file}) # 将include语句写入文件 file(APPEND allheader.h "#include \"${rel_path}\"\n") endforeach()
关键说明:
file(RELATIVE_PATH 输出变量 基准目录 目标文件):该命令会计算目标文件相对于基准目录的路径,并将结果存入rel_path变量- 写入时必须用
"${rel_path}"引用变量,才能把实际路径值写入文件,而非命令本身 - 提前用
file(WRITE)清空文件,避免每次运行CMake都追加重复内容
内容的提问来源于stack exchange,提问作者jcvu
相关产品推荐
相关产品推荐

