2

尝试使用 Make 时出现以下错误:

make: *** 没有规则来制作目标 `paging.c',​​`obj/paging.o' 需要。停止。

但是我已经给 makefile 提供了制作目标的规则。这是我的生成文件:

                                                                 --------
C_SOURCES= main.c monitor.c common.c descriptor_tables.c timer.c paging.c \
        fs.c initrd.c task.c syscall.c                           --------
S_SOURCES= boot.s interrupt.s gdt.s process.s
C_OBJECTS=$(patsubst %.c, obj/%.o, $(C_SOURCES))
S_OBJECTS=$(patsubst %.s, obj/%.o, $(S_SOURCES))
CFLAGS=-c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders
LDFLAGS=-Tlink.ld -melf_i386 --oformat=elf32-i386
ASFLAGS=-felf

all: kern/kernel

.PHONY: clean
clean:
-rm -f obj/*.o kern/kernel

kern/kernel: $(S_OBJECTS) $(C_OBJECTS)
ld $(LDFLAGS) -o $@ $^

$(C_OBJECTS): obj/%.o : source/%.c 
gcc $(CFLAGS) $< -o $@

vpath %.c source

$(S_OBJECTS): obj/%.o : %.s
nasm $(ASFLAGS) $< -o $@

vpath %.s asem

注意:--------不在原始 makefile 中,它们仅用于选择我使用的规则。

制作输出:

nasm -felf asem/boot.s -o obj/boot.o
nasm -fenasm -felf asem/boot.s -o obj/boot.o
nasm -felf asem/interrupt.s -o obj/interrupt.o
nasm -felf asem/gdt.s -o obj/gdt.o
nasm -felf asem/process.s -o obj/process.o
gcc -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders source/main.c -o obj/main.o
gcc -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders   source/monitor.c -o obj/monitor.o
gcc -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders   source/common.c -o obj/common.o
gcc -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders source/descriptor_tables.c -o obj/descriptor_tables.o
gcc -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders source/timer.c -o obj/timer.o
make: *** No rule to make target `source/paging.c', needed by `obj/paging.o'. Stop.

尽管给了它需要的东西,为什么它仍然出现错误?

4

3 回答 3

1

您将不得不更改线路

$(C_OBJECTS): obj/%.o : %.c

$(C_OBJECTS): obj/%.o : source/%.c

编辑,以反映问题的变化:

void page_fault(registers_t regs)
void page_fault(registers_t *regs);

比较 ;) 两者应该是一样的。根据 paging.c 中的代码块,应该更正 paging.h 中的版本(只需删除 *)。

于 2012-04-17T14:07:36.223 回答
0

文件 paging.c 是否与 Makefile 存在于同一目录中?

如果没有,Make 将寻找创建它的规则。由于没有创建 paging.c 的规则,它会给你这个错误。

于 2012-04-17T13:57:24.817 回答
0

该错误告诉您“make”在 vpath 或当前目录中的任何位置都找不到文件“paging.c”,并且没有从任何其他源文件创建“paging.c”的规则。

确保在您认为有的地方确实有“paging.c”,并且它实际上被称为“paging.c”而不是“paging.c”(额外空间)或其他一些看起来像“paging”的 unicode 特殊内容.c" 当您打印出来时,但不是。

于 2012-04-17T17:36:17.653 回答