2012-04-06 4 views
0

OK, make 및 makefile을 파악할 수 없었습니다. 행운을 빌어 맨페를 통해 읽기를 시도했습니다. 그래서 나는 여기에왔다 : Lmake 파일을 사용하여 별도의 디렉토리에서 파일 컴파일

하나의 파일에서 매우 관리되지 않는 파일들이있다. (나는 OS를 만들려고 노력하고있다.) 그리고 나는이 파일들을 별도의 하위 디렉토리 (아래 구조 참조)로 나누고 make가 그들의 .o 파일로 파일을 만들고, 다른 파일로 그것들을 옮기라고 말한다. 별도의 하위 디렉토리를 만들고 마지막으로 커널 파일로 마무리합니다.

C_SOURCES= main.c 
S_SOURCES= boot.s 
C_OBJECTS=$(patsubst %.c, obj/%.o, $(C_SOURCES)) 
S_OBJECTS=$(patsubst %.s, obj/%.o, $(S_SOURCES)) 
CFLAGS=-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 kern/kernel 

kern/kernel: $(S_OBJECTS) $(C_OBJECTS) 
ld $(LDFLAGS) -o [email protected] $^ 

$(C_OBJECTS): obj/%.o : %.c 
gcc $(CFLAGS) $< 

vpath %.c source 

$(S_OBJECTS): obj/%.o : %.s 
nasm $(ASFLAGS) $< 

vpath %.s asem 

그건 지금이 내 현재 메이크

        Parent directory 
          (where the makefile will be) 
              | 
              | 
    ------------------------------------------------------------------------- 
    |     |     |    |     | 
    Header SubDir  Source SubDir  ASM SubDir  Obj SubDir  Kern SubDir 
(Header files)  (Source Files)  (Assembly Files) (Object Files) (Kernel File) 

입니다

: 그래서이 내 의도 한 구조 트리입니다

(즉 복잡한 소리 죄송 경우, 잘하면 구조가 명확하게 일을하는 데 도움이됩니다) 이 오류가 튀어 나와 :

ld -Tlink.ld -melf_i386 --oformat=elf32-i386 -o kern/kernel obj/boot.o obj/main.o 
ld: cannot find obj/boot.o: No such file or directory 
ld: cannot find obj/main.o: No such file or directory 

미리 도움을 청하십시오!

제이미.

all: $(SOURCES) link 

당신은 소스를 만들 필요가 없습니다, 그래서 그 밖으로 떠나 보자

+2

무엇이 당신의 질문입니까? – bitmask

+0

관련 항목 : [GNU'make' documentation] (http://www.gnu.org/software/make/manual/make.html) – bitmask

+0

가능한 중복 http://stackoverflow.com/questions/1139271/makefiles-with -source-files-in-different-directories –

답변

0

은의이 단계에서이를 보자. , kern/kernel

all: kern/kernel 

kern/kernel: 
    ld $(LDFLAGS) -o kernel $(SOURCES) 

그러나 당신이 오브젝트 파일이 아닌 소스 파일을 연결할 및 생산 : 그리고 당신이 정말로 구축하려는 것은 그래서 대신 추상적 "링크의를 사용할 수 있도록, kern/kernel입니다 하지 상위 디렉토리 (난 당신이 make를 실행할 가정)에 :

kern/kernel: $(OBJECTS) 
    ld $(LDFLAGS) -o [email protected] $^ 

그리고 무엇 글쎄, 난 소스를 가정 오브젝트있는 .s 파일, 그리고 객체는 다른과 같은 이름을 가지고 접미사, 다른 위치에서 D :

SOURCES=boot.s main.s monitor.s common.s descriptor_tables.s isr.s interrupt.s gdt.s timer.s kheap.s paging.s 

OBJECTS=$(patsubst %.s,Obj/%.o,$(SOURCES)) 

그리고 이것은 객체를 만드는 방법은 다음과 같습니다. (그 마지막 줄이 있는지 확인이 소스를 찾을 위치를 알 수 있도록이다)

$(OBJECTS): Obj/%.o : %.s 
    nasm $(ASFLAGS) $< 

vpath %.s Src 

플래그는 좋아 보인다. 그리고 여기는 깨끗합니다.

.PHONY: clean 
clean: 
    -rm -f Obj/*.o kern/kernel 

많은 것을 한꺼번에 시도하기 때문에 첫 번째 시도에서는 효과가 없을 것입니다. 그것을 소용돌이 치고 결과를 알려주십시오.

+0

소스는 .s와 .c의 혼합입니다. 그래서 SOURCES = boot.s ... 등을 관련 서 픽스로 변경하겠습니까? –

+0

@JamieEdwards, 귀하의 질문에 언급하는 것이 좋을 것입니다. 가장 쉬운 방법은'C_SOURCES'와'S_SOURCES', 그리고'C_OBJECTS'와'S_OBJECTS'와'c' 파일을 컴파일하는 법칙입니다. – Beta

+0

진심으로 사과드립니다. 파일의 접미사를 넣었어야 했어. 정말로 할 일이있어. –

관련 문제