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

如何用Makefile编译目录及子目录下所有汇编文件?

解决Makefile编译多目录ASM文件到统一build目录的问题

你的Makefile问题出在规则关联错误:所有目标文件的依赖被设为全部ASM源文件,Make执行时会把$<解析为第一个源文件(即src/kernel/test1.asm),所以所有目标都用这个文件编译生成。

以下是修正后的Makefile写法,能实现每个ASM文件对应生成一个目标文件到build目录下:

# 可根据实际情况调整变量
BUILD_DIR ?= build
ASM = nasm
ASFLAGS = -f elf32

# 查找src/kernel下所有.asm文件
ASMSOURCES = $(shell find src/kernel -name '*.asm')
# 生成目标文件列表:build/xxx_asm.o
ASMOBJECTS = $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.asm, %_asm.o, $(ASMSOURCES))))

# 确保build目录存在(避免编译时因目录缺失报错)
$(BUILD_DIR):
	mkdir -p $@

# 为每个ASM文件生成单独的编译规则
$(foreach src, $(ASMSOURCES), \
	$(eval $(BUILD_DIR)/$(notdir $(patsubst %.asm, %_asm.o, $(src))): $(src) | $(BUILD_DIR) \
		@$(ASM) $(ASFLAGS) $< -o $@ \
	) \
)

# 默认目标:编译所有ASM目标文件
all: $(ASMOBJECTS)

# 清理生成的文件
clean:
	rm -rf $(BUILD_DIR)

关键修正点:

  • 使用foreach遍历每个ASM源文件,为对应的目标文件生成一对一的编译规则,确保每个目标只关联对应的源文件。
  • 添加| $(BUILD_DIR)作为顺序依赖,保证编译前先创建build目录。
  • 用$(notdir)提取源文件的文件名,确保目标文件直接生成在build目录下,不创建子目录。

内容的提问来源于stack exchange,提问作者Yassine Dakhlaoui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:16:07