2013-12-23 3 views
2

저는 Makefile을 아주 처음 보았습니다. 따라서 나는 대답을 돕기 위해 좋은 Google 검색을 찾을 수 없다는 질문에 직면했다.기본 'make'동작은 어디서 발생합니까?

다른 누군가가 페도라 설정을 배포 한 가상 OS를 실행 중입니다. 디렉토리에 내 자신의 Makefile을 만들면, 내가 좋아하는 컴파일을 위해 .c 파일을 설정할 수 있습니다. 그러나 단순히 make test을 실행하면 내 디렉토리에 test.c이 있으므로 다음과 같이 표시됩니다. clang -ggdb3 -std=c99 -Wall -Werror test.c -lcs50 -lm -o test.

이 관찰 다음 내 질문이 곳 기본값은 겉으로는 보편적는 make 동작에서 오는가했다? 다시 말해,이 Makefile은 하나 인 경우 내 파일 시스템에 어디에 있습니까? 일반적으로 리눅스의 기본 make 구현은

+2

맹렬히 착각하지 않으면 'make'로 연결됩니다. 이 유틸리티에는 다양한 소스 유형을 컴파일하기위한 몇 가지 기본 규칙이 있으며, 가장 널리 사용되는 것은 C (및 결국 C++) 프로그램의 컴파일입니다. –

답변

4

makeseveral predefined implicit rules있다. 두 가지가 있습니다 : n.o의 형식은 '$ (CC) $ (CPPFLAGS) $ (CFLAGS) -c'의 레시피 n.c에서 자동으로 만들어

컴파일 C 프로그램. N는 C 컴파일러를 통하여 (보통 LD라고도 함) 링커를 실행하여 자동 n.o로부터 제조 된 하나의 오브젝트 파일을 링크

. 정확한 레시피는 '$ (CC) $ (LDFLAGS) n.o $ (LOADLIBES) $ (LDLIBS)'입니다.

참고 make는 의미가 때 효과적으로 하나의 규칙으로 위의 두 가지를 연결하는 똑똑 :

는 ... 중간체로 '에서는 .o'오브젝트 파일을 사용하여 수행하지만, 수 한 단계로 컴파일 및 링크 작업을 수행하는 것이 더 빠르다.

make -pn으로 미리 정의 된 규칙을 덤프 할 수 있습니다. 예 :

 
$ make -pn -f /dev/null | grep -A3 '^%: %.c$' 
make: *** No targets. Stop. 
%: %.c 
# commands to execute (built-in): 
    $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

$ 
+0

도움이되는 답변 @ DigitalTrauma 및 @nos를 모두 주셔서 감사합니다. 'make -pn' 명령은이 모든 것이 "기본적으로"어디서 오는 지 알아 내는데 매우 유용했습니다. 그것은 내가 혼란스러워했던 모든 환경 변수들을 보여주었습니다. – ironicaldiction

2

이 GNU 간다 확인.

기본 규칙을 포함하는 파일 시스템에 기본 Makefile이 (가) 없습니다. 이 당신이 메이크 공급 여부 적용되는 메이크업에 내장 그러나 묵시적 규칙이 있으며, 를 호출 할 때 무엇을 makehere을 문서화 않습니다.

이러한 규칙은 예를 들어. .c 소스 파일에서 실행 파일을 빌드하는 방법. C 컴파일러를 통해 (일반적으로 LD라고도 함) 링커를 실행하여

n은 전혀에서 자동으로 구성됩니다 실행 파일을 만들 때 당신은 예를 들어 만들, 그 묵시적 규칙 here에 대해

을 배울 수있는 것은이 기본 규칙이 있습니다 . 사용 된 정확한 조리법은 '$ (CC) $ (LDFLAGS) 더 $ 없다 (LOADLIBES) $ (LDLIBS)'

당신이 make test을 실행하면이 파일 test.o에서 실행 test을 만들려고합니다

의 의미 , 각 CC/LDFLAGS/etc를 설정할 수 있습니다. 링크 할 때 사용할 변수.

그리고 다른 묵시적 규칙으로는 .c 파일에서 .o 인 파일을 만들 수 있으므로 위의 test.o을 찾아, 그리고 규칙을 사용하는 것을 다시 시도합니다 :

없는 것은에서 자동으로 만들어 nc는 '$ (CC) $ (CPPFLAGS) $ (CFLAGS) -c'형식의 제조법을 사용합니다.

.l.e. make test을 실행할 때의 암시 적 규칙은 먼저 test.c를 컴파일 한 다음 환경 변수로 설정하면 CC envirnment 변수 (또는 기본 컴파일러 cc)와 다양한 컴파일러/링커 플래그로 지정한 컴파일러를 사용하여 test.o를 링크합니다.

.

관련 문제