2011-12-29 1 views
1

메이크 파일에서는 의존 관계의 순서가 중요하다고합니다.make 의존성 순서

finalObjectFile: x.o main.o y.o 
    g++ x.o main.o y.o -o finalObjectFile 

main.o: header/x.h source/main.cpp 
    g++ -c source/main.cpp 

x.o: header/x.h source/x.cpp 
    g++ -c source/x.cpp 

y.o: source/y.cpp header/x.h 
    g++ -c source/y.cpp 

위의 코드에서 내가 헤더 파일 x.h의 위치를 ​​교환했다 :

x.o: header/x.h source/x.cpp 
     g++ -c source/x.cpp 

y.o: source/y.cpp header/x.h 
     g++ -c source/y.cpp 

하지만 출력은 영향을받지 않습니다 나는 방법을 이해하고자!

어떤 종류의 의존성이 실제로 중요합니까?

+0

어디서 들었습니까? 나는 그걸로 어떤 문제도 겪지 않았다 ... –

+0

@EricJohnson 이것을 보라 : http://www.eng.hawaii.edu/Tutor/Make/3-3.html –

+2

참조 된 페이지의 용어가 틀렸다. 2001 년에 작성되었습니다. 그것은 2001 년에도 웹에서 삭제되었을 것입니다. 또는 고정. –

답변

3

표시된 문맥에서 전에 소스과 소스 이전에 헤더 사이에 큰 차이가 없습니다. 규칙은 (예를 들어) 말 :

  • x.oheader/x.hsource/x.cpp보다 최신이어야합니다.

두 종속성이 나타나는 순서는 중요하지 않습니다. 종속성이 x.o보다 새로운 경우 명령이 실행됩니다.

언제 주문이 중요합니까? 그것은 예시하기가 다소 까다 롭지 만, 중간 단계에서 여러 개의 중간 파일이 생성되는 경우 요인이 될 수 있습니다. 특히 실행중인 명령 중 일부가 여러 파일에 영향을 미치지 만 모든 상호 작용에 대해 제대로 알려주지 않으면 문제가 발생할 수 있습니다.

그러나 종속성 순서는 일반적으로 문제가되지 않습니다.

+0

다음을보십시오 : http://www.eng.hawaii.edu/Tutor/Make/3-3.html'의존성이 나열되는 순서는 중요합니다. ' –

+2

그건 딱딱 거리고, Anisha - 미안하지만, 어쨌든 나쁘다. 의존성이 아니라 목표를 나타냅니다. makefile에 타겟이 나타나는 순서는 약간 중요합니다; makefile의 첫 번째 대상은 원하는 대상을 지정하지 않고'make'를 입력 할 때 만들어지기 때문에 중요합니다. 일반적으로 첫 번째 대상은 '모두'입니다. 'make target1 target2' 등 커맨드 라인에서 원하는 타겟을 만들 수 있습니다.하지만 타겟은 의존성이 아닙니다. 그래서 그 매뉴얼이 말한 것을 잊어 버리십시오. –

+0

Jon의 계몽주의에 감사드립니다. 결과는 종속성의 순서가 어떤 방식 으로든 중요하지 않다는 것입니다. 목표에 대해서도 질문이 있습니다. BTW> –

2

실제 make 파일에서는 패키지 규칙을 사용하는 경향이 있으므로 중요합니다. 규칙에 따라 $<으로 바뀌고 먼저이 필요합니다. 따라서 :

compile = g++ -c $< -o [email protected] 

x.o : source/x.cpp header/x.h 
    $(compile) 

y.o : header/y.h source/y.cpp 
    $(compile) 

첫 번째 규칙은 원하는대로 source/x.cpp을 컴파일합니다. 두 번째 규칙 은 header/y.h을 컴파일하려고 시도하지만, 이는 정확히 이 아닙니다.

메이크 파일을 작성하는 훨씬 일반적인 (합리적인) 방법이기 때문에 적어도 요소가 먼저 오는 순서와 관련하여 순서를 존중해야합니다.

그건 문제가 있습니다 (그러나 어떤이 잘 작성 메이크의 경우 안) 또 다른 경우 : 많은 경우에, make가 종속성을 올바른 순서로 왼쪽에서 를 해결할 수; 즉 주어진 :

x.o : source/x.cpp header/x1.h header/x2.h 
    ... 

makesource/x.cpp가 최신 버전인지 확인하고 필요한 경우 을 구축하고, 다음 순서로 header/x1.hheader/x2.h, 위해 동일을 할 것입니다. header/x1.hheader/x2.h 전에 빌드해야하는 명시 적이지 않은 종속성이있는 경우 해당 주문을 변경하면 문제가 발생할 수도 있습니다.그러나 이것은 메이크 파일 의 오류입니다. 종속성을 명시 적으로 지정해야합니다 (예 : header/x1.h : header/x2.h의 규칙). 이 순서가 보장되지 않기 때문에 그렇지 않으면 ; 예를 들어 GNU make의 경우 -j 옵션을 사용하면 위반할 수 있습니다. header/x.h, 주문을 교환하면 문제가 발생할 수 있습니다.

+0

답변의 두 번째 부분은 약간 불필요한 것으로 보입니다. 잘못된 것은 아니지만 잘못된 메이크 파일의 상황을 논의 할 필요가 없다고 생각합니다. 패키지 변수에 대한 언급이 조금 불필요하지만 자동 변수'$ < '의 문제가 내 머리 속에서 가장 먼저 터져 나왔습니다. 자동 변수는 레시피에서 직접 사용될 수도 있습니다. – eriktous

+0

@eriktous 나는 기본적으로 주문에 대한 명백한 의존성을 볼 수있는 경우를 설명하려고 애썼다. 나는 이것을 처리하는 올바른 방법이 makefile을 수정하는 것이라고 동의한다. 패키지 규칙과 관련하여 : 자동 변수를 모든 규칙에서 사용할 수 있지만 사실 패키지 규칙을 제외 할 필요는 없습니다. –