2010-06-21 3 views
9

내가 파일이 있다고 가정하자 :, 모든 * .CPP 파일

libs와 :

  • one.cpp,
  • two.cpp one.h,
  • three.cpp을 two.h, three.h

프로그램 :

program.cpp

  • 은 컴파일 할 Makefile을 만들 방법이 그 * 마지막 편집에서 수정 된 통화 당?

    현재 나는 그런 일이 있습니다

    SRCS = one.cpp two.cpp three.cpp 
    OBJS = $(SRCS:.cpp=.o) 
    
    all: $(OBJS) program 
    
    .cpp.o: 
        g++ -Wall -c $< 
    
    program: 
        g++ -Wall $(OBJS) program.cpp -o program 
    
    clean: 
        rm -f $(OBJS) program 
    

    내가 잘 작동하지만 그때 내 프로그램을 컴파일 할 때 two.cpp을 변경하거나 내가 때 때문에, 실행하는 최초의 "깨끗한 할"필요가 two.h 나는 두 번째로 내가 얻을 "make"를 실행합니다

    Nothing to be done for 'all'. 
    

    나는 그런 식으로 내 Makefile을 변경하려면 one.cpp이 two.cpp에서 코드를 사용하는 경우는 (내 변경 사항을 인식하고 파일과 종속성을 재 컴파일 수정 된 두 파일은 다시 컴파일해야합니다. 내가 two.cpp을 수정하면

    그래서, 어떻게해야합니다

    g++ -Wall -c two.cpp 
    g++ -Wall $(OBJS) program.cpp -o program 
    

    그러나 one.cpp가 수정 된 two.cpp의 코드를 사용하는 경우, 할 놈이야합니다

    g++ -Wall -c one.cpp 
    g++ -Wall -c two.cpp 
    g++ -Wall $(OBJS) program.cpp -o program 
    
+0

(나는'first.cpp'가 아니라'one.cpp'를 의미한다고 생각합니다.) – Beta

+0

예, one.cpp 여야합니다. – user360872

답변

12

먼저 우리가 가의 전제 조건 오브젝트 파일을 실행 파일. 이 작업이 완료되면, program SRCS 변경 때마다 하나를 다시 것입니다 확인, 그래서 우리는 명시 적으로 대상으로 OBJS 필요하지 않습니다 :

all: program 

program: $(OBJS) 
    g++ -Wall $(OBJS) program.cpp -o program 

그런 다음 우리는, 오브젝트의 헤더 파일 전제 조건을 그 경우 우리 three.o 다시 것입니다 확인, three.h 변경 :

$(OBJS): %.o : %.h 

을 마지막으로 one.cpp 이후 two.h (I 희망)에 의해 two.cpp에서 코드를 사용하여, 우리는 하나의 two.ha 전제 조건을 .오 :

one.o: two.h 

그리고 우리는 자동 변수 사용, 유지 관리하는 일이 더 깨끗하고 더 쉽게 만드는 : 모두 함께 넣어

program: $(OBJS) 
    g++ -Wall $^ program.cpp -o [email protected] 

를 우리가 얻을 :

SRCS = one.cpp two.cpp three.cpp 
OBJS = $(SRCS:.cpp=.o) 

all: program 

$(OBJS): %.o : %.h 

one.o: two.h 

.cpp.o: 
    g++ -Wall -c $< 

program: $(OBJS) 
    g++ -Wall $^ program.cpp -o [email protected] 

clean: 
    rm -f $(OBJS) program 

있습니다 우리가 할 수있는 일 (예 : OBJS에 program.o를 추가하는 것)이 몇 가지 더 있지만 오늘은 충분합니다.

1

추가 명령이 대상 이름의 오른쪽으로 실행되도록 의존하는 파일.

예 :

default: hello.c 
    gcc -o hello.bin hello.c 

install: hello.bin 
    cp hello.bin ../ 
+0

'$ (OBJS)'가 그게 아닌가요? – JAB

+0

당신이 말해요, 그것은 당신의 코드입니다. 종속성 필드에서 변수를 사용한 적이 한번도 없었지만 논리적으로는 작동하지 않도록하는 것은 없습니다. – mcandre

+0

하지만 내 코드가 아닙니다. – JAB

0

당신이 .o 인 파일을 .cpp 파일에 의존한다는 make 말하기 만 :

%.cpp.o: %.cpp 
    g++ -Wall -c -o [email protected] $< 
+0

헤더 파일이나 오브젝트 파일의 종속성 문제는 해결되지 않습니다. – Beta