2013-05-04 76 views
0

我的簡單的小makefile展現了我無法理解的行爲。如果我觸摸除Dictionary.cpp以外的任何源文件,則不會構建任何目標,並且如果我觸摸Dictionary.cpp,則它將編譯但不鏈接。源文件在src/object(.o)和依賴關係(.d)中,並且二進制文件進入bin/唉,makefile不會正確地依賴關係

如果我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 d文件定義的第一個目標將被視爲默認目標,而這恰好是obj/Dictionary.o

+0

Doh!當然,非常感謝。 – 2013-05-04 13:28:51