我有一个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.h
或Animal.cpp
时,它会更新Animals.o
和Animal
可执行文件。但是为什么不能用于main
?我已在此行中指定了如何更新main.o
: -
src/obj/%.o:src/%.cpp src/%.h
$(CXX) $(CXXFLGS) -c -o $@ $< $(PKG)
请帮助我,谢谢它提前:)
答案 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)