2

Make を使用しようとすると、次のエラーが発生します。

make: *** `obj/paging.o' が必要とするターゲット `paging.c' を作成する規則はありません。止まる。

しかし、ターゲットを作成するためのルールをメイクファイルに与えました。これが私のメイクファイルです:

                                                                 --------
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

注:--------元のメイクファイルにはありません。使用したルールを選択するために使用されます。

出力を行います:

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);

比較してください;) 2つは同じでなければなりません。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」と呼ばれていることを確認してください.c" を印刷すると表示されますが、そうではありません。

于 2012-04-17T17:36:17.653 に答える