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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:56:14