Makefile没有“看到”%.o%.asm规则

时间:2014-08-21 20:31:02

标签: makefile nasm

我正在编写一个项目,并想制作一个好的makefile。在某些时候,我注意到它不适用于多个.asm文件,我做了一些研究并修改了我的文件,所以看起来像这样:

PROJDIRS := kernel lib
ASMFILES := $(shell find $(PROJDIRS) -type f -name "*.asm")
SRCFILES := $(shell find $(PROJDIRS) -type f -name "*.c")
HDRFILES := $(shell find $(PROJDIRS) -type f -name "*.h")

ASMOBJCT := $(patsubst %.asm,%.o,$(ASMFILES))
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
TSTFILES := $(patsubst %.c,%_t,$(SRCFILES))

DEPFILES    := $(patsubst %.c,%.d,$(SRCFILES))
TSTDEPFILES := $(patsubst %,%.d,$(TSTFILES))

WARNINGS := -Wall -Wextra -pedantic

NASM=nasm
CC=/usr/local/cross/bin/i686-elf-gcc
CFLAGS=-nostdlib -nostdinc -ffreestanding -O2 $(WARNINGS) -masm=intel -Iinclude -std=c99
LDFLAGS=-T link.ld -nostdlib -ffreestanding -O2 -lgcc
ASFLAGS=-felf

all: $(OBJFILES) link

clean:
    -rm kernel/*.o
    -rm kernel/hal/*.o
    -rm _bin_/*.elf

link:
    /usr/local/cross/bin/i686-elf-gcc $(LDFLAGS) $(OBJFILES) $(ASMOBJCT) -o _bin_/kernel.elf

%.o: %.c
    $(CC) $(CFLAGS) $< -c -o $@

%.o: %.asm
    $(NASM) $(ASFLAGS) $< -o $@

但由于某种原因,最后一个不执行,因此链接器抛出一个错误,找不到所需的目标文件。我不知道我做错了什么。你知道如何解决这个奇怪的问题吗?

1 个答案:

答案 0 :(得分:3)

你永远不会告诉make构建它们。

您的默认规则是all: $(OBJFILES) link,它会告诉您构建$(OBJFILES)link目标中的所有内容。这不包括$(ASMOBJCT)中的任何内容,因此当link使用它们时它们不存在。

您可以通过将link目标的实际先决条件放在link:行上来解决此问题,如下所示:

link: $(OBJFILES) $(ASMOBJCT)

然后在链接行上使用$^(所有先决条件)而不是$(OBJFILES) $(ASMOBJCT)

然后,您可以从$(OBJFILES)目标先决条件列表中删除all,因为您不再需要它了。

您还可以将link替换为_bin_/kernel.elf目标行上的all,然后替换link:目标行,然后使用-o '$@'(规则目标)在连接线上而不是写出来。