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

如何让CMake仅在项目触发重编译时强制重编译指定文件?

实现方案

你可以通过对象库+源文件额外依赖的方式实现需求,完全匹配目标触发逻辑,不需要改动现有业务代码。

具体配置代码

将你原来的CMake配置:

add_executable(my_project use_date.c other_file.c main.c)

替换为以下配置:

# 1. 拆分源文件:将不包含__DATE__宏的普通源文件编译为独立对象库
add_library(project_common_objs OBJECT other_file.c main.c)

# 2. 定义最终可执行文件,链接普通对象库+日期源文件
add_executable(my_project use_date.c $<TARGET_OBJECTS:project_common_objs>)

# 3. 给日期源文件添加额外依赖:只要普通对象库的任意对象文件更新(即触发重编译),就强制重编use_date.c
set_source_files_properties(use_date.c PROPERTIES
    OBJECT_DEPENDS $<TARGET_OBJECTS:project_common_objs>
)

触发逻辑说明

这个配置完全匹配你的需求:

  • 无任何代码/头文件变更时执行make:所有对象文件均为最新状态,不会触发use_date.c重编译,也不会触发重链接,不会生成内容重复的可执行文件
  • 任意普通源文件(main.c/other_file.c)或它们依赖的头文件变更时:首先重编译变更的文件生成新的普通对象,检测到普通对象更新后自动触发use_date.c重编译,最后链接生成带最新构建日期的可执行文件
  • 手动修改use_date.c时:走CMake默认的文件变更检测逻辑,正常触发该文件重编译与后续链接,不受额外依赖影响

注意事项

如果你原来给my_project配置了头文件目录、编译选项、宏定义、链接库等属性,需要同步给project_common_objs目标,避免编译不一致。公共属性建议通过target_*命令配置为PUBLIC,或者直接设置为当前目录的全局编译属性,减少重复配置。


内容的提问来源于stack exchange,提问作者sdbbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:03:18