2012-07-26 5 views
1

this question 사람이 최종 해결책을 업데이트 한 곳, 문제 자체의 작업을위한 메이크 파일에 대해 이야기하고 있습니다. 어떻게 진행되고 있는지 이해하는데 시간을 보내고 있습니다. 이메이크 파일 이해하기

이해 드릴 수 없습니다
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c 
    @$(CC) $(CFLAGS) -c $< -o [email protected] 

같은 규칙이지만, 직관에 의해 나는 일을 할 것입니다 무엇을 알고있다. 거의 모든 것이 분명합니다. 감사!

+1

+1, 이유가 확실하지 않은 이유는 무엇입니까? –

답변

2

이것은 static pattern rule입니다. 첫 번째 필드는 대상 목록이고 두 번째는 대상의 목록 인 "", 두 번째는, 목표는 "줄기"를 분리하는 데 사용되는, 세 번째는 필수 구성 요소 목록을 구성하는 데 사용하는 사전 조건 패턴 입니다.

대상 패턴 obj/%.o에 대해 그것을 일치하는 것을 발견, 당신 make obj/foo.o이 (obj/foo.o 대상 목록 $(OBJECTS)에 있기 때문에) 사람이 사용하기로이 규칙 첫번째 식별을 확인하는 경우가

SRCDIR = src 
OBJDIR = obj 
OBJECTS = obj/foo.o obj/bar.o obj/baz.o 

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c 
    @$(CC) $(CFLAGS) -c $< -o [email protected] 

을 가정하자 스템 (와일드 카드 %과 일치하는 부분)은 foo이며, 해당 패턴을 사전 조건 패턴 src/%.c에 연결하면 선행 조건이 src/foo.c입니다. 당신은 또한 변수를 정의한 경우

CC = gcc 
CFLAGS = -thisflag -thatflag=something 

은 그런 규칙의 명령은

@gcc -thisflag -thatflag=something -c src/foo.c -o obj/foo.o 

이 ($< 첫 번째 전제 조건이고 [email protected] 대상 이름이라고합니다.)이된다

다른 질문에 대한 대답 : 예, 메이크 파일은 헤더 파일 (x.h)에 대한 종속성을 처리 할 수 ​​있으므로 헤더가 수정되면 Make가 대상을 다시 작성합니다. 아니,이 메이크 파일은 그렇게하지 않는다.당신은 당신이 흠이 실제로 무엇인지 가정

a.o: x.h 

같은 규칙을 추가, 손으로 메이크 파일을 수정할 수 있습니다, 또는 당신은 아마 당신은 아직 시도하지해야하는 고급 기술이다 메이크 자동으로 수행을 할 수 있습니다.

1

이 줄은 원본 (.c)에서 개체 파일 (.o)을 얻는 방법을 설명하며 각 .c 파일에 대해 줄을 반복하지 않아도됩니다.

개체는 컴파일러가 포함됩니다

$ (CC)는, CFLAGS 컴파일러에 대한 옵션을 포함 SRCDIR에 objdir를하고 소스에있을 것입니다 및 -C 객체로 소스를 컴파일하기 위해 GCC를 알려줍니다.

:

  • CC =

  • CFLAGS = -g -Wall

은 GCC -g -Wall -c TEST.C 로 전환 될 수 GCC -o test.o

+0

또한이 메이크 파일은 사용자가 정의한'.h' 파일을 어떻게 고려하는지 알려줍니다. '.h' 파일을 규칙의 대상 목록에 포함시키는 것을 의미합니다. –

+0

Makefile은 .h 파일을 처리하지 않습니다. 그들은 단순히 .c 파일을 컴파일러에게 넘겨 주는데,이 컴파일러는 파일에 필요한 포함을 찾는 책임이 있습니다. 대부분의 메이크 파일은 컴파일러에 플래그를 전달하여 추가 경로를 추가합니다. –

+0

@Aman Deep Gautam : Laurent가 정확합니다. Makefile은 동일한 일련의 쉘 명령을 생성합니다. include 폴더는 gcc의 옵션 인 -I를 통해 전달됩니다. 대부분의 MakeFiles에는 포함 폴더를 나타내는 변수가 포함되어 있습니다. – BlueTrin