2013-05-04 1 views
0

내 간단한 작은 메이크 파일이 내가 이해할 수없는 동작을 보여주고 있습니다. Dictionary.cpp를 제외한 소스 파일을 건 드리면 타겟이 만들어지지 않고 Dictionary.cpp를 터치하면 컴파일되지만 링크는되지 않습니다. 소스 파일은 src/object (.o)에 있고 의존성 (.d)은 obj /에 있고 바이너리는 bin/아아, 메이크 파일이 종속성을 올바르게 선택하지 않습니다.

에 있습니다.

만약 내가 rm obj/*이면 모든 것이 정상이지만 타임 스탬프는 보이지 않습니다. 주워. 아무도 내가 잘못 가고 있다고 말할 수 있습니까?

.D 파일

여기 Dictionary.d입니다, 제대로 생성되는 것 같다 : 나에게 올바른 보이는

obj/Dictionary.o: src/Dictionary.cpp src/pch.h src/Types.h src/Util.h \ 
src/Refcount.h src/Dictionary.h 
src/Dictionary.cpp: 
src/pch.h: 
src/Types.h: 
src/Util.h: 
src/Refcount.h: 
src/Dictionary.h: 

. 다음은 메이크 :

sources = Dictionary.cpp \ 
      Util.cpp  \ 
      Tile.cpp  \ 
      Board.cpp  \ 
      Vec2.cpp  \ 
      Letter.cpp  \ 
      Random.cpp  \ 
      Server.cpp  \ 
      main.cpp 

objects = $(patsubst %.cpp,obj/%.o,$(sources)) 
depends = $(patsubst %.cpp,obj/%.d,$(sources)) 

CXX = g++ 
CPPFLAGS = -Isrc -std=c++0x 
CXXFLAGS = -c 

-include $(depends) 

bin/dictionary: $(objects) 
    @echo Link... 
    $(CXX) $(CPPFLAGS) $(objects) -o bin/dictionary -lrt 

obj/%.o: src/%.cpp 
    @echo [$*] 
    @$(CXX) $(CPPFLAGS) $(CXXFLAGS) src/$*.cpp -o obj/$*.o 
    @$(CXX) $(CPPFLAGS) -MM src/$*.cpp -MF obj/$*.d 
    @mv -f obj/$*.d obj/$*.d.tmp 
    @sed -e 's|.*:|obj/$*.o:|' < obj/$*.d.tmp > obj/$*.d 
    @sed -e 's/.*://' -e 's/\\$$//' < obj/$*.d.tmp | fmt -1 | sed -e 's/^ *//' -e ' s/$$/:/' >> obj/$*.d 
    @rm -f obj/$*.d.tmp 

답변

1

당신은 끝으로 include를 이동하거나 전에 bin/dictionary 규칙을 넣어, 또는 all: bin/dictionary (가) 포함하기 전에 규칙 또는 뭔가를 추가해야합니다.

또는 항상 make bin/dictionary으로 실행하는 것이 좋습니다. 그래도 작동됩니다.

기본적으로 make는 makefile에서 첫 번째 대상을 빌드하려고 시도합니다. 다른 대상보다 먼저 include 행이 있기 때문에 include 파일로 정의 된 첫 번째 대상은 기본 목표로 간주되며 그 결과는 obj/Dictionary.o입니다.

+0

Doh! 물론 고마워요. –

관련 문제