【发布时间】:2015-10-27 06:01:26
【问题描述】:
我是 makefile 的新手,我从在线示例中制作了这个 makefile 来构建我的项目并且它可以工作。事实证明,当我在不更改任何源代码的情况下再次运行它时,所有目标文件都会重新编译。我认为 make 应该只重新编译那些改变了输入文件的目标。为什么会这样? =.=
#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
-
要么,要么您需要将规则设为
$(TARGET): …。 -
我将规则名称更改为 $(TARGET) 但没有运气..@JonathanLeffler
标签: makefile