2014-03-31 2 views
0

make은 세 개의 파일 만 사용하여 배우려고합니다. 나는 다음과 같은 makefile을 사용하는 경우Makefile 첫 번째 규칙 대상

foo.h

#ifndef __foo_H_ 
#define __foo_H_ 

void print(); 

#endif 

foo.c를

#include <stdio.h> 
#include "foo.h" 


void print() 
{ 
    printf("Hello World !"); 
} 

을 main.c는

#include "foo.h" 

int main() 
{ 
    print(); 
    return 0; 
} 

, 다 잘

메이크

를 실행
CC = gcc 
CFLAGS = -I. 
DEPS = foo.h 
OBJ = foo.o main.o 

.PHONY: clean 

main: $(OBJ) 
     gcc -o [email protected] $^ $(CFLAGS) 

%.o: %.c $(DEPS) 
     $(CC) -c -o [email protected] $< $(CFLAGS) 

clean: 
     rm *.o 

위의 코드는 기본적으로 make이 첫 번째 대상 (기본적으로 모든 곳에서 읽음)을 실행하기 때문에 작동합니다. 기본적으로 make은 첫 번째 규칙을 실행하기 때문에

내가 위 메이크에 make를 호출 아래 메이크

CC = gcc 
CFLAGS = -I. 
DEPS = foo.h 
OBJ = foo.o main.o 

.PHONY: clean 

clean: 
     rm *.o 

main: $(OBJ) 
     gcc -o [email protected] $^ $(CFLAGS) 

%.o: %.c $(DEPS) 
     $(CC) -c -o [email protected] $< $(CFLAGS) 

를 사용하는 경우에만 make clean 실행됩니다.

문제는 내가 그 첫 번째 대상이기 때문에

gcc -c -o foo.o foo.c -I. 
gcc -c -o main.o main.c -I. 
gcc -o main foo.o main.o -I. 

왜 그냥 .o 파일을 구축하고 멈추지 make 않습니다 얻을 make를 사용하여 위 메이크에서이 메이크

CC = gcc 
CFLAGS = -I. 
DEPS = foo.h 
OBJ = foo.o main.o 

.PHONY: clean 

%.o: %.c $(DEPS) 
     $(CC) -c -o [email protected] $< $(CFLAGS) 

main: $(OBJ) 
     gcc -o [email protected] $^ $(CFLAGS) 

clean: 
     rm *.o 

함께 왜 메인을 구축 할 수 있을까요? main을 빌드하는 첫 번째 규칙에서 지정한 부분이 없습니다.

+0

아마도 첫 번째 * 특정 * 목표가 작성된다는 규칙이있을 것입니다. '% .o : % .c $ (DEPS)'와 같은 암시적인 패턴 규칙은 특정 대상을 지정하지 않습니다. –

+0

@j_random_hacker 패턴이 유효한 대상이 아닙니다.? 그래서 위의 패턴을 사용하여 오브젝트 파일 만 빌드하는 makefile을 사용한다면,'make'는 아무 일도 일어나지 않을 것으로 예상합니다. 이상하지 않습니까? –

+0

@j_random_hacker 예, 패턴 만 지정하면 'make :'는 'make : *** No targets, Stop." –

답변

5

"첫 번째 대상"규칙은 명시 적으로 개의 대상을 계산합니다. 접미사 규칙이나 패턴 규칙과 같은 암시 적 대상은 포함하지 않습니다.

고려 : 어떻게하면 .o 파일을 만들어야한다고 결정할 수 있습니까? 어느 파일을 .o 빌드해야합니까? 다른 변수에 비해 변수 OBJ에 변수를 작성해야한다는 것을 어떻게 알 수 있습니까?

+0

그러나이 패턴은 모든 .c 파일에 대한 오브젝트 파일을 작성하는 한 라이너로 사용할 수 없습니다. '파일입니까? –

+0

해당 패턴 규칙은'% .o'와 일치하지만 요청을 작성하는 데 필요한 모든 명시 적 대상을 지정하지 않습니다. 특히 make는 빌드 할 대상을 찾지 않습니다. 빌드하기 위해 말한 것만 빌드합니다 (빌드하기 위해 빌드해야하는 것으로 결정되는 것). –

+0

@Kartik Anand : 아니요. 그 패턴은 ".c가 있고 .o를 만들고 싶다면이 조리법으로 할 수 있습니다."라고 말합니다. 그것은 추상적 인 성명서입니다. make는 _all'.c' files_이 무엇을 의미하는지 이해할 수있는 기능이 없다. 그것은 (자체적으로) 디렉토리의 모든 파일을 조사하고 패턴과 일치하는 것으로 보이는 파일을 선택하여 빌드하지 않습니다. make는 메이크 파일의 명시 적 타겟이나 명령 행 (예 :'make foo.o')에 의해 명시 적으로 빌드하도록 지정한 대상을 빌드합니다. – MadScientist

1

설명서의 좋은 부분을 찾으려고했지만 구체적이고 구체적인 것을 찾지 못했습니다. 질문에 대한 대답은 내가 아는 한 패턴 규칙이 목표가 아니며 기본 목표는 이름에서 알 수 있듯이 목표가되어야한다는 것입니다.

정적 패턴 규칙 (대상을 정의 함)을 사용했다면, make가 첫 번째 파일을 선택하고이 경우에 파일을 빌드하기 때문에 기대치가 거의 맞을 것입니다. .

+0

나는 똑같은 생각을하고 있었지만, 명시 적으로 어디서나 그것을 찾을 수 없었습니다. –

+0

주의 깊게 읽으면 매뉴얼에서 목표와 규칙에 대해 명확하게 이야기합니다 기본 목표에 대해 이야기하고, 목표를 정의하고, 패턴 규칙을 정의합니다.이 매뉴얼이 매뉴얼을 자세히 작성하는 가장 가까운 방법입니다. –

관련 문제