我目前正在研究SDL2项目,目录的结构如下
./
|__assets
| |__*.png
|__src
| |__physcis
| |_*.cpp *.hpp
| |__textures
| |_obstacles
| |_*.cpp *.hpp
| |_constants
| |_*.cpp *.hpp
|
|__Makefile
目前,我的makefile具有非常简单的结构
生成文件:
ROOTDIR=src/
TXTURDIR = src/textures/constant/
OBSTACLEDIR = src/textures/obstacles/
PHYSDIR = src/physics/
OBJS = $(ROOTDIR)Main.cpp \
$(ROOTDIR)WindowInit.cpp \
$(ROOTDIR)Timer.cpp \
$(ROOTDIR)GameLoop.cpp \
$(PHYSDIR)Gravity.cpp \
$(TXTURDIR)Texture.cpp \
$(TXTURDIR)TextureContainer.cpp \
$(TXTURDIR)Ball.cpp \
$(TXTURDIR)Bob.cpp \
$(TXTURDIR)Text.cpp \
$(TXTURDIR)ScoreCounter.cpp \
$(TXTURDIR)FPSCounter.cpp
CC = g++
COMPILER_FLAGS = -g -o
LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf
OUT = exe
all: $(OUT)
$(OUT): $(OBJS)
$(CC) $(COMPILER_FLAGS) $@ $^ ${LINKER_FLAGS}
clean:
rm exe
有什么方法可以通过仅在发生更改时仅编译某些文件夹,然后将编译后的部分链接在一起来加快我的制作过程?
最佳答案
是的,这正是Makefiles设计要做的事情。这是对您现有的Makefile所做的一组更改:
更改您的OBJS
变量,使其引用.o
文件而不是.cpp
文件。这会将您现有的编译规则转换为链接规则。
OBJS = $(ROOTDIR)Main.o \
$(ROOTDIR)WindowInit.o \
$(ROOTDIR)Timer.o \
# ... etc ...
借助内置的implicit rules,使人们已经知道如何从
.o
文件创建.cpp
文件。但是,您确实需要将配置变量名称调整为Make的隐式规则所期望的名称。不要在编译器标志中放入-o
选项,Make会自己添加它。# _instead of_ setting CC, COMPILER_FLAGS, LINKER_FLAGS
CXX = g++
CXXFLAGS = -g
LIBS = -lSDL2 -lSDL2_image -lSDL2_ttf
调整链接规则以匹配调整后的变量名称。 (您目前没有CPPFLAGS,但将来可能会需要它。)
$(OUT): $(OBJS)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS)
在文件的底部,添加一组没有配方的规则,指定每个目标文件的各个依赖关系。这是当您更改头文件时安排重新构建事物的方式,并且还可以解决某些功能失常的情况,有时Make会在使用完目标文件后立即删除它们。 (对于这样大小的项目,最简单的方法是手动跟踪哪些源文件使用哪些头文件。当它足够大以至于您想让计算机为您处理时,请查看automake。)
$(ROOTDIR)Main.o: $(ROOTDIR)Main.cpp foo.h bar.h
$(ROOTDIR)WindowInit.o: $(ROOTDIR)WindowInit.cpp foo.h bar.h
# ... etc ...
更改
clean
目标以也清理目标文件(当您使用它时,请使用-rm -f
而不是裸rm
)。clean:
-rm -f $(OUT) $(OBJS)
在文件的最底部添加
.PHONY
批注:严格来说这不是必需的,但是如果您出于某种原因而拥有名为“all”或“clean”的文件,则可以防止发生奇怪的事情:.PHONY: all clean
就是这样,您就完成了。