2012-07-29 4 views
3

Makefile은 중간 파일을 삭제하지 않습니다. .INTERMEDIATE을 설정했습니다. 여기 내 메이크 파일은 다음과 같습니다. 의 무엇이 잘못 되었나요?Makefile은 중간 파일을 삭제하지 않습니다.

+4

사이드 질문 : 나는 .INTERMEDIATE를 모르지만, 왜 이것을하고 싶은지 물을 수 있습니까? Makefile은 좋기 때문에 소스가 변경되지 않은'.o' 파일을 재 구축하는 것을 피할 수 있습니다. 매번 모든 것을 다시 작성하려면 스크립트 만 사용하면 안됩니까? – Shahbaz

+0

당신은 의존성'prefixer.c' ->'접두사를 놓친다.o' –

+0

@BasileStarynkevitch 무슨 뜻이야? 그것의 두 번째'prefixer.o : stack.h ....' – darksky

답변

8

난 당신이 다음 .INTERMEDIATE을 넣을 경우 객체가 항상 제거 될 것이라고 생각하기 때문에 당신은 아마

.SECONDARY: $(OBJECTS) 

을 의미 .INTERMEDIATE

의 역할 Gnu make special targets를 참조하십시오, 당신은 아마 싶지 않아요. 나는 의미심장하게 %.o을 특수 타겟의 전제 조건으로 생각할 수 없다고 생각합니다.

오브젝트 파일을 보존하여 시간 재 컴파일에 시간을 낭비하지 않도록 제안합니다.

한 번 실행하면 make -pmake에 대해 많은 것을 알 수 있습니다.

remake -x (즉, remake)을 사용하면 적어도 복잡한 Makefile -s를 디버깅하는 데 매우 유용합니다. make -d을 사용할 수도 있지만 너무 자세합니다.

make보다 우수한 건축업자를 사용하는 것이 좋습니다. omake.

+0

하지만 아무것도하지 않습니까? '.SECONDARY $ (OBJECTS)'는 무엇을 할 것인가? 나는 디렉토리에서 혼란을 제거하고 따라서'.INTERMEDIATE'를 사용하고 싶다. 둘째, 소스가 수정 된 경우 어떻게 재 컴파일할까요? 어떤 아이디어? – darksky

+0

특별한 타겟 트릭을하지 않으면'* .o'가 디렉토리에 만들어지고 유지됩니다 (왜냐하면'make'는 전이 의존성을 다루기 때문입니다). 그리고'make'는 적절하게 다시 컴파일 될 것입니다. 물론 * source * -> * object * 의존성을 주어야합니다. –

+0

어떤 이유로 소스 파일 중 하나를 변경하고'make '를 다시 실행하면'prefixer'가 최신이라고합니다. 그렇지 않은 경우. 내가 여기서 무엇을 놓치고 있니? 나는이 "기능"이 디폴트로'make'라고 생각하고 추가 명령을 필요로하지 않는다. – darksky

0

내가 이해하는 한, .INTERMEDIATE은 이미 존재하는 중간 파일을 삭제하지 않아야합니다. 이것은 GNU make의 문서입니다 :

중간 파일은 모든 다른 파일과 마찬가지로 규칙을 사용하여 다시 작성됩니다. 그러나 중간 파일은 두 가지 방식으로 다르게 취급됩니다.

첫 번째 차이점은 중간 파일이없는 경우 발생합니다. 일반 파일 b가 존재하지 않고 make가 b에 의존하는 대상을 고려하면 b는 항상 b를 생성 한 다음 b에서 대상을 업데이트합니다. 그러나 b가 중간 파일 인 경우 make는 충분히 혼자 남을 수 있습니다. b의 일부 전제 조건이 해당 대상보다 새로운 경우 또는 해당 대상을 업데이트 할 다른 이유가없는 경우 업데이트 b 또는 궁극적 인 대상을 신경 쓰지 않습니다.

두 번째 차이점은 make가 다른 것을 갱신하기 위해 b를 작성하면 더 이상 필요하지 않은 이후에 b를 나중에 삭제한다는 것입니다. 따라서 make 전에 존재하지 않은 중간 파일도 make 후에 존재하지 않습니다. make는 삭제할 파일을 보여주는 'rm -f'명령을 인쇄하여 사용자에게 삭제 내용을보고합니다.

따라서 make를 실행하기 전에 디렉토리에 *.o이 없는지 확인하십시오.

5

.INTERMEDIATE% 와일드 카드에서 작동하지 않습니다. 이것을 시도하십시오 :

.INTERMEDIATE: stack.o prefixer.o 
관련 문제