Makefile不更新一个特定文件

时间:2018-02-13 17:27:46

标签: c++ makefile

我有一个makefile,适用于所有其他文件,但不适用于main.cpp文件。当我更改main.cpp文件时,它不会更新main.o

这是makefile:

CXX = g++
SRCF = main.cpp Animal.cpp
SRC = $(addprefix src/, $(SRCF))

VER = Debug
CXXFLAGS = -Wall -std=c++17
EXE = Animal
OBJF = $(subst .cpp,.o, $(SRCF))
OBJ = $(addprefix src/obj/, $(OBJF) )
#PKG = `pkg-config --libs --cflags sdl2`


$(VER)/$(EXE) : $(OBJ)
    $(CXX)  $(CXXFLGS) -o $@ $< $(PKG)

src/obj/%.o:src/%.cpp src/%.h
    $(CXX)  $(CXXFLGS) -c -o $@ $< $(PKG)

clean:
    rm -rf $(EXE) $(OBJ)

print-%  : ; @echo $* = $($*)

当我更改Animal.hAnimal.cpp时,它会更新Animals.oAnimal可执行文件。但是为什么不能用于main ?我已在此行中指定了如何更新main.o: -

src/obj/%.o:src/%.cpp src/%.h
    $(CXX)  $(CXXFLGS) -c -o $@ $< $(PKG)

请帮助我,谢谢它提前:)

1 个答案:

答案 0 :(得分:1)

在GNU Make手册的Introduction to Pattern Rules部分:

  

为了应用模式规则,其目标模式必须与所考虑的文件名匹配,所有先决条件(模式替换后)必须命名存在或可以创建的文件

因此,如果没有src/main.h(或无法制作),则以下模式规则将与src/obj/main.o不匹配:

src/obj/%.o: src/%.cpp src/%.h
    $(CXX)  $(CXXFLGS) -c -o $@ $< $(PKG)

您需要一个没有src/%.h先决条件的其他模式规则:

 src/obj/%.o: src/%.cpp
        $(CXX)  $(CXXFLGS) -c -o $@ $< $(PKG)