2016-03-25 2 views
1

Я пытался сделать этот Makefile работать как минимум три раза. С каждой итерацией я приближаюсь к своей цели, фиксируя некоторые предыдущие проблемы, перечитывая официальные документы GNU. Теперь у меня осталось только одно место, которое я не понимаю.Почему make продолжает перекомпилировать все объекты?

Вот 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 [email protected] $(LDFLAGS) 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o build/$(notdir [email protected]) 

run: all 
    ./$(EXECUTABLE) 

clean: 
    rm -rf build/* 

depend: $(SOURCES) 
    makedepend $^ 

# DO NOT DELETE 

Моя цель состоит в том, чтобы собрать все файлы в ./build каталог. И мне недавно удалось это сделать с некоторыми функциями имени файла, как описано в документах GNU.

Но теперь каждый раз, когда я запускаю make или make run, он перекомпилирует весь проект.

Как исправить это, чтобы работать только для файлов, которые были изменены недавно?

+0

Я не специалист по make-файлу, но, похоже, ваше правило '.cpp.o' не содержит никаких зависимостей. – Angew

ответ

2

Я думаю, вам нужно установить ОБЪЕКТЫ как этого

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

вместо

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

сказать Makefile, что объекты находятся в ./build каталога. В настоящее время вы просто говорите $ (CC), чтобы размещать выходы в ./build (-o build ...), но когда ему нужно проверить, обновлены ли OBJECTS, проверка завершилась неудачно, так как он ищет объекты в текущем каталоге и поэтому сбор ретриггеров.

Как только это будет сделано, вы можете удалить addprefix из команды компоновщика.

+0

Я изменил его, как вы предложили, но теперь он жалуется на 'No rule to make target 'build/MyApp.o', необходимый для 'build/assimptemplate'. Stop.' 'assimptemplate' - это имя окончательного исполняемого файла. Таким образом, это явно генерируется этапом связывания, который теперь выглядит следующим образом: '$ (EXECUTABLE): $ (OBJECTS) \ n $ (CC) $ (OBJECTS) -o $ @ $ (LDFLAGS)' – poetryofruins

0

.cpp.o: выглядит странно в вашем файле. Вероятно, вместо него выполняется неявное правило (см. https://www.gnu.org/software/make/manual/html_node/Using-Implicit.html#Using-Implicit). Вы можете добавить команду echo, чтобы убедиться, что ваша команда компилятора запущена, или имплицитный.

+0

Это правило означает прямое соответствие файла '.cpp' файла' .o', расположенного рядом с файлом '.cpp'. – user3159253

Смежные вопросы