我目前正在研究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

就是这样,您就完成了。

10-08 19:31