Я новичок в makefile, я готовлю этот make-файл из онлайн-примеров для создания моего проекта, и он работает. Оказывается, что, когда я запускаю его снова без изменения исходного кода, все объектные файлы повторно скомпилируются. Я думаю, что make должен только перекомпилировать те цели, которые изменили входные файлы. Почему это происходит? =. =makefile избежать перекомпиляции, когда источник не изменился
#makefile
ROOTDIR = $(dir $(CURDIR))
icc iccclean: PLAT = icc
gcc gccclean: PLAT = gcc
clang clangclean: PLAT = clang
icc: CC = icpc
gcc: CC = g++
clang: CC = clang-omp++
#these are not important and I removed the details
LIBS =
INC =
FLAG =
DEF =
icc gcc clang: run_de
SRCDIR = $(ROOTDIR)source #path to all .cpp .h files
OBJDIR = $(ROOTDIR)build/$(PLAT) #path of output .o files
TARGET = $(ROOTDIR)run_de.$(PLAT) #final executable product
#the final product depends on object files core.o eval.o file_processing.o
run_de: $(OBJDIR)/core.o $(OBJDIR)/eval.o $(OBJDIR)/file_processing.o
cd $(OBJDIR); $(CC) $(LIBS) $(FLAG) $(INC) $(DEF) -o $(TARGET) core.o eval.o file_processing.o
#rules of making the object files
$(OBJDIR)/core.o: $(SRCDIR)/core.cpp
$(CC) -c $(FLAG) $(LIBS) $(INC) $(DEF) $(SRCDIR)/core.cpp -o $(OBJDIR)/core.o
$(OBJDIR)/eval.o: $(SRCDIR)/eval.cpp
$(CC) -c $(FLAG) $(LIBS) $(INC) $(DEF) $(SRCDIR)/eval.cpp -o $(OBJDIR)/eval.o
$(OBJDIR)/file_processing.o: $(SRCDIR)/file_processing.cpp
$(CC) -c $(FLAG) $(LIBS) $(INC) $(DEF) $(SRCDIR)/file_processing.cpp -o $(OBJDIR)/file_processing.o
gccclean iccclean clangclean:
$(RM) $(OBJDIR)/*.o $(TARGET)
.Phony: icc gcc clang iccclean gccclean clangclean
Обратите внимание, что 'make' обрабатывает' .PHONY' совсем иначе, чем '.Phony'. –
Ваше правило для 'run_de' не создает файл, поэтому команды выполняются каждый раз (создавая' run_de.icc', 'run_de.gcc' или' run_de.clang') в тщетной надежде, что он создаст ' run_de'. Это не так, поэтому в следующий раз он снова пытается. Пересмотрите правило связи. –
Вы имеете в виду, что имя правила 'run_de' также должно быть именем выходного файла? @JonathanLeffler –