我是新來的makefile的東西,我從網上的例子來編譯這個makefile來構建我的項目,它的工作原理。事實證明,當我在不更改任何源代碼的情況下再次運行它時,所有目標文件都會重新編譯。我認爲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'對''PhonyY'的處理與'.Phony'完全不同。 –
你對'run_de'的規則不會創建這個文件,所以每次執行這些命令(創建'run_de.icc','run_de.gcc'或'run_de.clang')時,都希望它會創建' run_de'。它沒有,所以下一次,它再次嘗試。重新考慮你的鏈接規則。 –
您的意思是規則'run_de'的名稱也應該是輸出文件的名稱? @JonathanLeffler –