Makefile:尽管给出了目标,但没有规则制定目标?

时间:2012-04-17 13:54:35

标签: c makefile

尝试使用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.

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

3 个答案:

答案 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”,但不是。