我正在编写一个项目,并想制作一个好的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 $@
但由于某种原因,最后一个不执行,因此链接器抛出一个错误,找不到所需的目标文件。我不知道我做错了什么。你知道如何解决这个奇怪的问题吗?
答案 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 '$@'
(规则目标)在连接线上而不是写出来。