尝试使用Make时出现以下错误:
make: *** No rule to make target `paging.c', needed by `obj/paging.o'. Stop.
但是我已经为makefile提供了制作目标的规则。这是我的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.
尽管给出了它需要的东西,为什么它会出现错误?
答案 0 :(得分: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中的版本(只需删除*)。
答案 1 :(得分:0)
文件paging.c是否与Makefile存在于同一目录中?
如果没有,Make会查找创建它的规则。由于没有创建paging.c的规则,它会给你这个错误。
答案 2 :(得分:0)
错误告诉您“make”无法在vpath或当前目录中的任何位置找到“paging.c”文件,并且没有从任何其他源文件创建“paging.c”的规则。 / p>
确保你实际上有“paging.c”你认为你做了,并且它实际上被称为“paging.c”而不是“paging.c”(额外的空间)或其他一些unicode特殊的东西看起来就像打印出来时的“paging.c”,但不是。