You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:23:26