如何通过CMake从动态生成文件取值设置编译选项?
问题:如何从动态生成的文件中取值,设置CMake编译选项
-DVAR=xxx? 我需要设置编译选项-DVAR=xxx,其中xxx是动态生成的,仅以var.txt文件内容的形式存在。我已经完成了以下步骤:
- 创建自定义命令生成存储该值的
var.txt文件 - 创建自定义目标确保
var.txt被构建 - 添加依赖保证
var.txt在MyExe编译前生成
但不知道如何从var.txt中读取值,将其用于target_compile_options。我的CMake代码示例如下:
cmake_minimum_required(VERSION 3.13) project ("MyProject") add_custom_command ( OUTPUT var.txt COMMAND echo "123" > var.txt # 这里是示例,实际生成逻辑更复杂 COMMENT "Generate variable value" ) add_executable (MyExe main.cpp) target_compile_options (MyExe PUBLIC -DVAR=???) # 如何获取var.txt的内容来设置VAR? add_custom_target (var ALL DEPENDS var.txt) add_dependencies (MyExe var)
请问target_compile_options能否直接使用从生成文件中获取的值?
解决方案
直接用target_compile_options无法实现需求,因为CMake的配置阶段(执行cmake ..时)就会处理target_compile_options,而var.txt是在构建阶段(执行make/ninja时)才生成的,配置阶段根本无法读取到文件内容。需要根据生成逻辑的执行时机,选择以下两种方案:
方案1:配置阶段预生成并读取值
如果生成var.txt的逻辑可以在配置阶段执行(比如不需要依赖构建产物),可以用execute_process直接执行生成命令,读取输出值,再设置编译选项:
cmake_minimum_required(VERSION 3.13) project ("MyProject") # 配置阶段执行生成逻辑,直接获取值 execute_process( COMMAND echo "123" # 替换为实际的生成命令 OUTPUT_VARIABLE VAR_VALUE OUTPUT_STRIP_TRAILING_WHITESPACE # 去除输出末尾的换行符 ) add_executable(MyExe main.cpp) # 直接使用读取到的变量值设置编译选项 target_compile_options(MyExe PUBLIC -DVAR=${VAR_VALUE})
方案2:构建阶段生成头文件传递值
如果生成var.txt的逻辑必须在构建阶段执行(比如依赖其他构建产物),可以通过生成头文件的方式传递值,在代码中直接使用宏定义:
cmake_minimum_required(VERSION 3.13) project ("MyProject") # 生成存储值的var.txt add_custom_command( OUTPUT var.txt COMMAND echo "123" > var.txt COMMENT "Generate variable value" ) # 从var.txt读取值,生成头文件var_config.h,内容为#define VAR xxx add_custom_command( OUTPUT var_config.h COMMAND echo "#define VAR $(cat var.txt)" > var_config.h DEPENDS var.txt # 确保先生成var.txt再生成头文件 COMMENT "Generate config header file" ) add_executable(MyExe main.cpp var_config.h) # 将生成的头文件加入源文件列表 add_custom_target(var ALL DEPENDS var.txt var_config.h) add_dependencies(MyExe var) # 让编译器能找到生成的头文件(头文件在构建目录下) target_include_directories(MyExe PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
之后在main.cpp中直接包含头文件使用:
#include "var_config.h" // 即可使用VAR宏,值为var.txt中的内容
内容的提问来源于stack exchange,提问作者abcdefg
相关产品推荐
相关产品推荐

