如何让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
相关产品推荐
相关产品推荐

