Makefile编译标志变更触发重编译问题:清理后构建失败求助
解决Makefile清理后重构建崩溃的问题
我明白你遇到的问题了——你的规则思路是对的,用一个文件记录CFLAGS的变化来触发重编译,但问题出在myCFile.o的依赖定义上:你只给它加了compilerflagChange作为依赖,这直接覆盖了Make默认的.o文件依赖规则(默认会关联对应的.C源文件)。所以当你清理项目后重新构建时,Make完全不知道myCFile.o需要从myCFile.C生成,自然会报错找不到源文件。
这里有两种简单的修正方案:
方案1:手动指定编译规则并补全依赖
直接在myCFile.o的规则里同时写上源文件和compilerflagChange作为依赖,并且明确编译命令:
compilerflagChange: FORCE echo ${CFLAGS} | cmp -s - $@ || echo ${CFLAGS} > $@ myCFile.o: myCFile.C compilerflagChange $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
这样Make就清楚知道,要生成myCFile.o,既需要源文件myCFile.C,也需要检查compilerflagChange的状态,两者满足才会执行编译。
方案2:仅补全依赖,复用Make的隐含规则
如果你不想手动写编译命令,只想让Make用默认的C编译规则,那只需要给myCFile.o补充源文件依赖即可:
compilerflagChange: FORCE echo ${CFLAGS} | cmp -s - $@ || echo ${CFLAGS} > $@ myCFile.o: compilerflagChange myCFile.C
这种方式更简洁,Make会自动套用它内置的.C.o规则来完成编译,同时依然会在compilerflagChange更新时触发重编译。
额外优化建议
另外,用echo输出CFLAGS可能会引入换行符,导致cmp的判断出现偏差(比如不同环境下echo的换行行为不一致)。建议换成printf来避免这个问题:
compilerflagChange: FORCE printf '%s' "${CFLAGS}" | cmp -s - $@ || printf '%s' "${CFLAGS}" > $@
这样能确保写入compilerflagChange的内容和cmp对比的内容完全一致,不会被换行符干扰。
内容的提问来源于stack exchange,提问作者Sharky
相关产品推荐
相关产品推荐

