如果不需要,避免在 Make 中链接和编译

Avoid linking and compiling in Make if not needed

作为来自 的后续问题:我的 Makefile 将执行链接,即使代码中没有任何更改。为什么?我怎样才能避免这种行为,以便 make 在代码未更改的情况下不会执行任何操作?

OBJS    = main_no_mkl.o
SOURCE  = main_no_mkl.cpp
HEADER =    IO.h
OUT     =       test
CXX     = ../../mpich-install/bin/mpic++
CXXFLAGS    =   -I../../intel/mkl/include   -Wl,--start-group    -Wl,--end-group    -lpthread   -lm -ldl    -Wall
LDFLAGS   =       ../../intel/mkl/lib/intel64/libmkl_scalapack_lp64.a       -Wl,--start-group       ../../intel/mkl/lib/intel64/libmkl_intel_lp64.a ../../intel/mkl/lib/intel64/libmkl_core.a  ../../intel/mkl/lib/intel64/libmkl_sequential.a    -Wl,--end-group ../../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.a -lpthread       -lm     -ldl

all: $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)

# create/compile the individual files >>separately<<
main_no_mkl.o:    main_no_mkl.cpp
    $(CXX)  -c  main_no_mkl.cpp $(CXXFLAGS)

.PHONY : all

问题出在您的 all 目标上。它不会生成 all(并且也标记为 .PHONY)文件。勾选这个 answer for a reminder about .PHONY. (You are violating the second Rule of Makefiles.)

所以 second/etc 时间你 运行 make (假设 .PHONY 标记不存在)make 会寻找一个 all 文件,找不到它,并假设它必须重新创建它。

使用 .PHONY 时,您将文件查找逻辑短路,并使 总是 假设它需要再次 运行 配方。

所以,基本上,您已经告诉 make 始终 运行 链接步骤,因此 make 会这样做。

改用它来解决该问题。

all: $(OUT)

$(OUT): $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)

郑重声明 运行ning make -d 阅读输出会向您指出这一点。

这些对象实际上是您输出的依赖项,您的 "all" 目标应该取决于输出。所以你应该做这样的事情:

all: $(OUT)

$(OUT): $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)