如何通过CMake每次编译时自动构建含编译日期的CPP文件?
解决每次编译自动更新含
__DATE__的文件问题 问题原因分析
- 你之前的第一个自定义目标(
build_software_version)和静态库没有建立依赖关系,CMake不会主动触发它,所以touch命令没机会执行,文件时间戳不变,自然不会重新编译。 - 第二个方法用
PRE_BUILD事件对静态库无效:CMake的PRE_BUILD是针对目标的构建步骤,但静态库本身没有独立的构建步骤,只有编译源文件的过程,所以会抛出错误。
可行解决方案
方案1:给自定义目标添加依赖关系
修改原代码,让静态库依赖自定义目标,确保每次编译库前先更新文件时间戳:
set(VERSION_FILE "src/software_version.cpp") add_custom_target(build_software_version ALL COMMAND ${CMAKE_COMMAND} -E touch ${VERSION_FILE} COMMENT "Updating build date trigger file" ) add_library(${PROJECT_NAME} STATIC src/software_version.cpp # 其他源文件... ) # 让库依赖自定义目标,强制先执行touch add_dependencies(${PROJECT_NAME} build_software_version)
方案2:用add_custom_command生成文件(更可靠)
直接生成包含__DATE__的文件,通过内容变化确保每次都重新编译,避免依赖时间戳的不确定性:
# 生成到构建目录,避免污染源码 set(GENERATED_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/generated_software_version.cpp") add_custom_command( OUTPUT ${GENERATED_VERSION_FILE} COMMAND ${CMAKE_COMMAND} -E echo "#include \"software_version.h\"" > ${GENERATED_VERSION_FILE} COMMAND ${CMAKE_COMMAND} -E echo "const char* get_build_date() { return \"__DATE__\"; }" >> ${GENERATED_VERSION_FILE} COMMENT "Generating build date file" ) add_library(${PROJECT_NAME} STATIC ${GENERATED_VERSION_FILE} # 其他源文件... ) # 确保头文件路径能被找到 target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} )
效果验证
两种方案都会在每次构建时,触发目标文件的重新编译,构建日志中会出现该文件的编译记录,__DATE__宏也会更新为当前编译日期。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

