如何用模式简化Makefile中配方相同的多目标规则?
简化Makefile规则的方法
你可以通过封装通用配方+合并特定目录规则的方式,彻底消除重复代码:
方案一:用define封装通用编译逻辑
先把重复的编译配方抽成通用片段,再在各个规则里复用:
# 定义通用编译配方,避免重复编写 define COMPILE_C_SNIPPET @mkdir -p $(dir $@) @$(CC) $(CFLAGS) -c $< -o $@ @echo "CC $(patsubst $(PWD)/%,%,$<)" endef # 根目录下的.c文件编译规则,依赖main.h $(BUILD_OBJ_DIR)/%.o: %.c main.h $(COMPILE_C_SNIPPET) # 合并main/event/cmd目录的规则,依赖$(MAIN_HEADERS) $(BUILD_OBJ_DIR)/main/%.o $(BUILD_OBJ_DIR)/event/%.o $(BUILD_OBJ_DIR)/cmd/%.o: %/%.c $(MAIN_HEADERS) $(COMPILE_C_SNIPPET)
方案二:用foreach批量生成目录规则
如果后续可能新增更多类似目录,用循环生成规则更高效:
# 根目录通用规则 $(BUILD_OBJ_DIR)/%.o: %.c main.h @mkdir -p $(dir $@) @$(CC) $(CFLAGS) -c $< -o $@ @echo "CC $(patsubst $(PWD)/%,%,$<)" # 循环生成main/event/cmd目录的编译规则 $(foreach subdir,main event cmd,$(eval \ $(BUILD_OBJ_DIR)/$(subdir)/%.o: $(subdir)/%.c $(MAIN_HEADERS) @mkdir -p $(dir $@) @$(CC) $(CFLAGS) -c $< -o $@ @echo "CC $(patsubst $(PWD)/%,%,$<)" \ ))
说明
两种方案都能实现代码简化:
- 方案一可读性更强,适合目录数量固定的场景;
- 方案二更灵活,后续新增目录只需在
foreach的列表里添加目录名即可。
内容的提问来源于stack exchange,提问作者Metal Slime
相关产品推荐
相关产品推荐

