Gnu make 尽管使用了对象文件,GNU仍进行重新编译

Gnu make 尽管使用了对象文件,GNU仍进行重新编译,gnu-make,Gnu Make,我最近从Cmake转到GNU make只是为了学习一些新东西。在我的Makefile中,我设置了它,这样它将创建对象文件并链接它们,但每次我调用make而不是重新编译已更改的文件时,它都会重新编译每个文件 我的Makefile # Output directory of the *.o files ODIR = obj # Compiler flags FLAGS = -std=c++17 -w -Wfatal-errors LINKER_FLAGS = -lSDL2 -lSDL2_image

我最近从Cmake转到GNU make只是为了学习一些新东西。在我的Makefile中,我设置了它,这样它将创建对象文件并链接它们,但每次我调用make而不是重新编译已更改的文件时,它都会重新编译每个文件

我的Makefile

# Output directory of the *.o files
ODIR = obj
# Compiler flags
FLAGS = -std=c++17 -w -Wfatal-errors
LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf -lSDL2_mixer

#dependencies for output:
output: animation.o Asset_Manager.o Collision.o Engine.o Entity_Manager.o Entity.o Map.o Texture_Manager.o main.o
    g++ $(ODIR)/*.o -o game $(LINKER_FLAGS)
    ./game

#object files

animation.o: src/animation.hpp src/animation.cpp
    g++ -c src/animation.cpp $(FLAGS) -o $(ODIR)/animation.o

Asset_Manager.o: src/Asset_Manager.hpp src/Asset_Manager.cpp
    g++ -c src/Asset_Manager.cpp $(FLAGS) -o $(ODIR)/Asset_Manager.o

Collision.o: src/Collision.hpp src/Collision.cpp
    g++ -c src/Collision.cpp $(FLAGS) -o $(ODIR)/Collision.o

Engine.o: src/Engine.hpp src/tank.hpp src/Engine.cpp
    g++ -c src/Engine.cpp $(FLAGS) -o $(ODIR)/Engine.o

Entity_Manager.o: src/Entity_Manager.hpp src/Entity_Manager.cpp
    g++ -c src/Entity_Manager.cpp $(FLAGS) -o $(ODIR)/Entity_Manager.o

Entity.o: src/Entity.hpp src/Component.hpp src/Entity.cpp
    g++ -c src/Entity.cpp $(FLAGS) -o $(ODIR)/Entity.o

Map.o: src/Map.hpp src/Map.cpp
    g++ -c src/Map.cpp $(FLAGS) -o $(ODIR)/Map.o

Texture_Manager.o: src/Texture_Manager.hpp src//Texture_Manager.cpp
    g++ -c src/Texture_Manager.cpp $(FLAGS) -o $(ODIR)/Texture_Manager.o

main.o: src/main.cpp
    g++ -c src/main.cpp $(FLAGS) -o $(ODIR)/main.o

# Release Build
release:
    g++ -std=c++17 -O3  -s -DNDEBUG \
    ./src/*.cpp -o game_release \
    $(LINKER_FLAGS)
    ./game_release

# Recipes for the a spicy meatballs

run:
    ./game

run_release:
    ./game_release

clean:
    rm $(ODIR)/*.o game
为什么调用make时会重新编译所有内容?

您正在破坏:

这条规则说“如果你想构建一个文件
Map.o
,那么这里有一个方法可以做到这一点”。但是你在这里没有说实话,因为这个配方没有构建
Map.o
,而是构建
$(ODIR)/Map.o
。所以下次make runs会看到,“哦,我需要目标
Map.o
,但它不存在,这里有一个可以创建它的配方,我会运行它!”但是这个配方再次没有构建
Map.o

Map.o: src/Map.hpp src/Map.cpp
        g++ -c src/Map.cpp $(FLAGS) -o $(ODIR)/Map.o