唉,makefile不会正确地获取依赖项

时间:2013-05-04 07:15:12

标签: makefile gnu-make

我简单的小makefile表现出我无法理解的行为。如果我触摸除Dictionary.cpp之外的任何源文件,则不会构建任何目标,如果我触摸Dictionary.cpp,则它会编译但不链接。源文件位于src / object(.o)中,依赖项(.d)位于obj /中,二进制文件进入bin /

如果我是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:

哪个看起来对我不对。这是makefile:

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 个答案:

答案 0 :(得分:1)

您必须将include移至最后,或将bin/dictionary规则放在其前面,或在包含之前添加all: bin/dictionary规则或其他内容。

或者,让自己辞职,始终运行make bin/dictionary,这也会有效。

记得make默认情况下尝试在makefile中构建第一个目标。由于您在任何其他目标之前有include行,因此include d文件定义的第一个目标将被视为默认目标,恰好是obj/Dictionary.o