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 -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 时会重新编译所有内容?
解决方案
您正在打破makefiles 的第二条规则:
Map.o: src/Map.hpp src/Map.cpp
g++ -c src/Map.cpp $(FLAGS) -o $(ODIR)/Map.o
这条规则说“如果你想构建一个文件Map.o
,那么这里有一个可以做到这一点的食谱”。但是您在这里没有说实话,因为该配方不会构建Map.o
,它会构建$(ODIR)/Map.o
。所以下一次 make 运行它会看到,“哦,我需要目标Map.o
,但它不存在,这是一个可以创建它的配方,我会运行它!” 但再一次配方没有建立Map.o
。
推荐阅读
- azure - 使用 SAML (IdP) 请求在 Azure B2C 和 SABA 中集成 SSO
- r - R 为 chisq.test 创建二乘二表
- javascript - 正则表达式匹配动态模式
- multithreading - Kafka消费者和Web服务器同时,线程阻塞问题微服务
- java - Spring-GraphQL 是 RSQL 的一个很好的替代品吗?
- android - 将 ImageView 与 textView 中的文本对齐
- php - group result by country and count
- python - 从文件 UTIL PYTHON 导入模块:DATAPROC JUPYTER 笔记本错误
- android - LazyRow Jetpack Compose 中可见项目的数量
- swift - 如何在 swift 中为 tableview 中的每个单元格提供 4 种不同的颜色