make以某种方式更改了配方,但没有遵循Makefile

make以某种方式更改了配方,但没有遵循Makefile,makefile,gnu-make,Makefile,Gnu Make,不知何故,make没有遵循makefile,而是生成了配方本身。将c源代码编译为.o的方法是: @$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include 当然,这使得编译器抱怨缺少几个头文件。此外,-trace报告了: <builtin>: update target 'cexpand.o' due to: cexpand

不知何故,make没有遵循makefile,而是生成了配方本身。将c源代码编译为.o的方法是:

  @$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include  
当然,这使得编译器抱怨缺少几个头文件。此外,-trace报告了:

<builtin>: update target 'cexpand.o' due to: cexpand.c
:由于以下原因更新目标“cexpand.o”:cexpand.c
现在,有没有办法阻止它这样做

整个Makefile:

//just incase someone asked, it's from my wip os NetDOS-32. Also, I'm not really an expert in Makefiles.
OBJ=$(patsubst %.c,%.o,$(wildcard *.c))
CC=i686-elf-gcc
CFLAGS=-Wextra -Wall -O2 -s -Wno-int-to-pointer-cast
NASM=nasm
NFLAGS=-felf32 
LD=i686-elf-gcc
all: os.iso 

os.iso:kernel.elf
    -@mkdir -p isodir/boot/grub
    @cp kernel.elf isodir/boot/kernel.elf
    @cp grub.cfg isodir/boot/grub/grub.cfg
    @sudo grub-mkrescue -o os.iso isodir
    
boot.o:boot.asm
    @echo "[NASM($(NASM))] $<"
    @$(NASM) -o $@ $<  $(NFLAGS)
%.o:%.c mm/%.c font.h Makefile 
    @echo "[CC($(CC))] $<" 
    @$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include  
kernel.elf:$(OBJ) boot.o
    @echo "[LD($(LD))] $(OBJ) boot.o"
    @$(LD)  -Tlinker.ld -o $@ -ffreestanding -O2 -nostdlib  boot.o  $(OBJ) -lgcc   $(CFLAGS) 
clean:
    -rm *.o *.elf 
test: all
    qemu-system-x86_64 -cdrom os.iso 
//万一有人问起,这是我的wip os NetDOS-32。另外,我不是一个真正的makefile专家。
OBJ=$(patsubst%.c、%.o、$(通配符*.c))
CC=i686极低频gcc
CFLAGS=-Wextra-Wall-O2-s-Wno int到指针强制转换
NASM=NASM
NFLAGS=-felf32
LD=i686极低频gcc
全部:os.iso
os.iso:kernel.elf
-@mkdir-p isodir/boot/grub
@cp kernel.elf isodir/boot/kernel.elf
@cp grub.cfg isodir/boot/grub/grub.cfg
@sudo grub mkrescue-o os.iso isodir
boot.o:boot.asm

@echo“[NASM($(NASM))]$您的规则如下所示:

%.o:%.c mm/%.c font.h Makefile 
仅当所有先决条件都已存在或可以创建时,模式规则才会应用。如果不存在,则该规则将不应用,make将继续查找另一个规则。在这种情况下,存在将匹配的内置规则,它将使用这些规则

因此,我的期望是,对于
cexpand.o
目标,此模式规则不适用。很可能是因为文件
mm/cexpand.c
不存在

%.o:%.c mm/%.c font.h Makefile