2012-04-17 2 views
1

나는 다음과 같은 오류 얻을 확인 사용하려고 시도하는 동안 :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. 

왜 그것이 필요로 무엇을 제공에도 불구하고 오류가 나오고 ?

+1

원본과 .s 파일의 .c 파일을 asem로 만드는 경우, makefile이 작성된 그대로 작동합니다. 아마도 당신은 전사 오류를 만들었을 것입니다. 필자는 "paging.c"파일이 실제로 "source"디렉토리에 존재하는지, 그 철자/대문자 사용법을 정확히 확인합니다. –

답변

0

paging.c 파일이 Makefile과 동일한 디렉토리에 있습니까?

그렇지 않은 경우 Make는 규칙을 만들 것입니다. paging.c를 만들 규칙이 없으므로이 오류가 발생합니다.

+1

없음이 시점 XD 때까지 일을 ... –

+0

으로 정의 된 디렉토리 "소스"에 존재 –

+0

vpaths 잘 더 복잡한 일을했는지 ​​확인 일부의 vpath 지시어,있을 표시 VPATH %의이 .c 소스 –

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의 버전을 수정해야합니다 (그냥 *를 제거해야합니다).

+0

makefile을 편집해도 여전히 동일한 오류가 발생합니다. L –

+0

make 프로세스가 작업 디렉토리를 변경합니까 (예 : "Entering directory ...")? – GergelyPolonkai

+0

예 다음과 같이 표시됩니다 : gcc -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -headers source/timer.c -o obj/timer.o –

0

"make"가 vpath 또는 현재 디렉토리에서 "paging.c"파일을 찾을 수없고 다른 소스 파일에서 "paging.c"를 작성하는 규칙이 없다는 오류가 표시됩니다.

실제로 "paging.c"가 있다고 생각하고 실제로 "paging.c"(여분의 공백)가 아닌 "paging.c"또는 다른 유니 코드 특수 것들 인쇄 할 때 "paging.c"와 유사하지만 보이지 않습니다.

관련 문제