You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用模式简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:42:13