我一直试图使这个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文档描述的那样。
但现在每次运行make
或make run
时,它都会重新编译整个项目。
如何修复它只适用于最近更改过的文件?
答案 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
命令,以确定您的编译器命令是运行还是隐含的命令。