为什么要不断重新编译所有对象?

时间:2016-03-25 10:54:52

标签: c++ makefile

我一直试图使这个Makefile至少工作三次。随着每次迭代,我越来越接近我的目标,修复一些以前的问题,同时重新阅读官方GNU文档。现在我只剩下一个我不理解的地方。

这里是Makefile:

MAKEFLAGS=-j2
CC=clang++
OPTIMALIZATION=-O2
CFLAGS=-c -std=c++11 -gsplit-dwarf -I. -Iengine -Iengine/bootstrap
LDFLAGS=-lglut -lGL -lGLU -lGLEW -lSOIL -lassimp
SOURCES=$(wildcard *.cpp engine/*.cpp engine/lighting/*.cpp engine/bootstrap/*.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=$(addprefix build/,$(shell basename ${PWD}))

.PHONY: depend clean

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(addprefix build/,$(notdir $(OBJECTS))) -o $@ $(LDFLAGS)

.cpp.o:
    $(CC) $(CFLAGS) $< -o build/$(notdir $@)

run: all
    ./$(EXECUTABLE)

clean:
    rm -rf build/*

depend: $(SOURCES)
    makedepend $^

# DO NOT DELETE

我的目标是将所有文件构建到./build目录中。我最近设法用一些文件名函数来做,就像GNU文档描述的那样。

但现在每次运行makemake run时,它都会重新编译整个项目。

如何修复它只适用于最近更改过的文件?

2 个答案:

答案 0 :(得分:2)

我认为您需要像这样设置OBJECTS

OBJECTS=$(addprefix ./build/, $(SOURCES:.cpp=.o))

而不是

OBJECTS=$(SOURCES:.cpp=.o)

告诉makefile对象在./build目录中。 目前你只是告诉$(CC)将输出放在./build(-o build ...)中,但当需要检查OBJECTS是否是最新的时,检查失败,因为它在当前目录中查找对象和所以重新编译汇编。

完成此操作后,您可以从链接器命令中删除addprefix。

答案 1 :(得分:0)

.cpp.o:在makefile中看起来很奇怪。可能会运行隐式规则而不是它(参见https://www.gnu.org/software/make/manual/html_node/Using-Implicit.html#Using-Implicit)。您可以向maks添加一些echo命令,以确定您的编译器命令是运行还是隐含的命令。