CMake中使用add_custom_command(PRE_BUILD)生成源文件失败求助
解决CMake构建前生成头文件供编译使用的问题
问题根源
你之前用PRE_BUILD类型的add_custom_command没生效,核心原因是:PRE_BUILD命令是在目标整体构建开始前执行,但CMake在解析源文件依赖时,会优先触发编译那些直接引用未生成头文件的.cpp文件,导致头文件还没生成就开始编译,自然报找不到的错误。另外,你没把生成头文件的目录加入目标的包含路径,也是找不到头文件的关键原因。
正确实现步骤
1. 定义生成头文件的自定义命令
用add_custom_command指定头文件的生成规则,明确输出文件和生成逻辑:
# 生成my_file.h的自定义命令 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/my_file.h # 生成的头文件放在二进制目录(避免污染源码目录) COMMAND <你的生成命令> # 替换成实际生成头文件的命令,比如python generate_header.py # 如果生成需要依赖输入文件,比如模板或配置文件,加上MAIN_DEPENDENCY # MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/header_template.txt COMMENT "Generating my_file.h..." )
2. 创建自定义目标绑定生成命令
单独创建一个自定义目标,确保生成头文件的命令会被执行:
add_custom_target( generate_my_header DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/my_file.h )
3. 配置测试目标的依赖和包含路径
在你的mytest目标中,添加对自定义生成目标的依赖,并把生成头文件的二进制目录加入包含路径:
# 构建测试目标,包含你的源文件和my_file.cpp add_executable(mytest ${SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/my_file.cpp) # 将生成头文件的目录加入包含路径,让编译器能找到my_file.h target_include_directories(mytest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # 确保生成头文件的命令在编译mytest前执行 add_dependencies(mytest generate_my_header)
额外说明
- 把生成的头文件放在
CMAKE_CURRENT_BINARY_DIR是CMake的最佳实践,避免修改源码目录,同时支持多配置构建(Debug/Release)各自生成独立的文件。 - 如果你的生成命令需要传递参数,直接在
COMMAND后面追加即可,比如COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/gen_header.py --output ${CMAKE_CURRENT_BINARY_DIR}/my_file.h。
内容的提问来源于stack exchange,提问作者Moop
相关产品推荐
相关产品推荐

