Makefile未执行多个目标问题排查求助
问题分析与解决方案
你遇到的问题很典型——Make默认只会执行Makefile中的第一个目标,而你的$(SUB_DIRS)作为目标列表,Make只会处理列表里的第一个条目(也就是src/zmachine),不会自动遍历整个列表。
具体原因
看你的Makefile,第一个定义的目标是$(SUB_DIRS),当你直接运行make时,Make会把这个目标列表里的第一个元素作为默认目标来构建,剩下的src/cheap不会被触发,因为没有任何目标依赖它。
修复方案
你需要添加一个明确的all目标,将它设为默认目标,并让它依赖于所有子目录目标。修改你的根Makefile如下:
CC ?= gcc CFLAGS += -Wall -std=c99 CFLAGS += -D_POSIX_C_SOURCE=200809L CFLAGS += -O2 -fomit-frame-pointer RANLIB ?= $(shell which ranlib) AR ?= $(shell which ar) export CC export AR export CFLAGS export RANLIB SRC_DIR = src ZMACHINE_DIR = $(SRC_DIR)/zmachine ZMACHINE_LIB = $(ZMACHINE_DIR)/quendor_zmachine.a CHEAP_DIR = $(SRC_DIR)/cheap CHEAP_LIB = $(CHEAP_DIR)/quendor_cheap.a SUB_DIRS = $(ZMACHINE_DIR) $(CHEAP_DIR) SUB_CLEAN = $(SUB_DIRS:%=%-clean) # 添加默认目标all,依赖所有子目录 all: $(SUB_DIRS) $(SUB_DIRS): @echo $(SUB_DIRS) @echo "DIR:" @echo $@ $(MAKE) -C $@ $(SUB_CLEAN): -$(MAKE) -C $(@:%-clean=%) clean clean: $(SUB_CLEAN) help: @echo "Quendor" .PHONY: all $(SUB_DIRS) $(SUB_CLEAN) clean help
为什么这样管用?
all作为第一个目标,会成为Make的默认执行目标all依赖于$(SUB_DIRS)里的两个目录,Make会遍历所有依赖项,逐个触发对应的子Makefile构建- 更新
.PHONY规则,把all也标记为伪目标,避免和同名文件冲突
验证方法
修改后再次运行make,你会看到输出里同时出现src/zmachine和src/cheap的构建日志,两个子目录的Makefile都会被正确调用。
内容的提问来源于stack exchange,提问作者Jeff Nyman
相关产品推荐
相关产品推荐

