2017-11-17 4 views
0

를이 내 메이크 파일입니다 업데이트 된 경우에도 파일을 작성하지 않습니다 -make가 종속성을

VER = Debug 
CC = g++ 

OBJECTFIELS = main.o Time.o 

main: $(OBJECTFIELS) 
    $(CC) $(OBJECTFIELS) -o [email protected] 

$(OBJECTFILES): Time_.h 

clean: 
    rm $(OBJECTFIELS) main 

나는 Time_.h 파일을 변경할 때마다 아무 일도 발생하지 않습니다 : -

$ make 
make: 'main' is up to date. 
$ touch Time_.h 
$ make 
make: 'main' is up to date. 

다른 파일이 변경되면 컴파일됩니다. -

제발 멍청한 놈입니다. 이유가 무엇입니까?

+2

오타 : 변수에 'OBJECTFIELS'이 (가) 있지만'OBJECTFILES' (으)로 사용하려고합니다. – melpomene

+0

@melpomene 감사합니다 !!! 나는 너무 어리 석고 화가났다. –

답변

-3

Time_.h에 대한 규칙에서 새 .o 파일을 생성해야합니다.

$(OBJECTFILES): Time_.h 

이것은 make가 Time_.h가 업데이트 될 때마다 명령을 실행해야한다고 말했습니다하고 명령 main.o를하고 Time.o. 모두를 생성하는 것 그러나 명령은 주어지지 않습니다!

Time.o: Time_.h 
     $(CC) Time_.cpp -o Time.o 

이것은 원하는 규칙의 종류입니다. Time_.h가 변경 될 때마다 $ (CC) Time_.cpp -o Time.o가 실행되어 Time.o가 생성됩니다. 이제 다른 규칙이 Time.o에 종속되면 make는 Time.o를 만드는 데이 명령을 사용할 수 있지만 마지막으로 make를 실행 한 후 Time_.h가 변경된 경우에만 실행해야한다는 것을 알 수 있습니다.

원본 파일 이름이 예상 한 개체 파일과 정확히 일치하지 않는 것 같기 때문에 "Time.o"를 명시 적으로 지정하고 있습니다. (Time.o vs Time_.o)

+0

하지만 설명서에이 sysntax를 사용할 수 있다고 나와있다. - https://www.gnu.org/software/make/manual/html_node/Combine-By-Prerequisite.html#Combine-By-Prerequisite –

+0

지금은 그 스타일을 피할 것입니다 ... 표준 makefile 형식은 여기를 참조하십시오. https://www.gnu.org/software/make/manual/html_node/Rule-Example.html#Rule-Example – Ebonair

+1

필수적이다. make는 소스 파일에서 오브젝트 파일을 빌드하는 방법을 알고 있으며, 작동하는 경우 내장 규칙을 사용하는 것이 매우 합리적이며 피할 수 없습니다. 질문의 원래 메이크 파일은 완전히 정확하고 위의 주석에 언급 된 변수 이름의 오타를 제외하고는 수정이 필요하지 않습니다. – MadScientist