如何让Make实现自适应:优先从编译失败的目标开始编译?
解决Make从最近失败目标开始编译的问题
这个场景我太熟悉了——改完头文件后,Make先一股脑编译所有依赖它的文件,最后才碰那个真正出问题的目标,白浪费一堆时间,太闹心了!好在有几个办法能让Make“聪明”点,优先处理上次失败的目标:
1. 手动指定先编译失败的目标
最直接的临时解决方案:如果上次是Z.o编译失败,直接运行:
make Z.o
先单独把Z.cpp的问题解决掉,确认编译通过后,再跑完整的make命令。这个方法不需要修改任何配置,适合临时快速修复问题。
2. 调整Makefile的目标顺序(一劳永逸)
Make默认会按照依赖树的拓扑顺序构建目标,但你可以通过修改all目标的依赖顺序,强制让Z.o优先编译。比如把你的Makefile里的all目标改成:
all: Z.o A.o B.o ... Y.o your_program_name
这样每次运行make时,会先尝试构建Z.o,如果它编译失败,Make会直接停止,不会去浪费时间编译A.o、B.o这些依赖Z.h的文件。等你把Z.h的拼写错误修好后,再跑make就能先通过Z.o的编译,再处理其他目标。
3. 使用GNU Make 4.3+的--start-from参数
如果你用的是GNU Make 4.3或更高版本,官方提供了专门的参数来解决这个问题:
make --start-from=Z.o
这个参数会让Make从指定的目标(也就是上次失败的Z.o)开始构建,先处理它的依赖,完成后再继续构建后续的目标。既不需要改Makefile,又能精准定位到失败点,是最灵活的方案。
补充:为什么默认Make会先编译A.o这些文件?
因为Z.h是A.o、B.o等多个目标的依赖,当Z.h被修改后,Make会认为所有依赖它的目标都需要重新编译。而默认情况下,Make会按照依赖树的拓扑顺序(或者目标在Makefile中的出现顺序)来处理,如果你没有指定优先级,Z.o可能会被排在后面,导致你要等一堆无关编译完成后才看到真正的错误。
内容的提问来源于stack exchange,提问作者Joachim W
相关产品推荐
相关产品推荐

