나는 다음과 같은 오류 얻을 확인 사용하려고 시도하는 동안 :Makefile : 목표물을 제공함에도 불구하고 목표물을 만드는 규칙이 없습니까?
make: *** No rule to make target `paging.c', needed by `obj/paging.o'. Stop.
을하지만 메이크에게 대상을 만들기위한 규칙을 주었다.
--------
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 [email protected] $^
$(C_OBJECTS): obj/%.o : source/%.c
gcc $(CFLAGS) $< -o [email protected]
vpath %.c source
$(S_OBJECTS): obj/%.o : %.s
nasm $(ASFLAGS) $< -o [email protected]
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.
왜 그것이 필요로 무엇을 제공에도 불구하고 오류가 나오고 ?
원본과 .s 파일의 .c 파일을 asem로 만드는 경우, makefile이 작성된 그대로 작동합니다. 아마도 당신은 전사 오류를 만들었을 것입니다. 필자는 "paging.c"파일이 실제로 "source"디렉토리에 존재하는지, 그 철자/대문자 사용법을 정확히 확인합니다. –