如何用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
相关产品推荐
相关产品推荐

