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

gsa*_*ras 3 c++ linker makefile compilation

作为此处的后续问题:即使代码中没有任何更改,我的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
Run Code Online (Sandbox Code Playgroud)

Eta*_*ner 5

问题是你的all目标.它不会生成all(并标记.PHONY为)文件.请查看此答案以获取提醒.PHONY.(你违反了Makefile的第二条规则.)

所以你运行的第二个/ etc时间make(假设.PHONY标记不存在)make将查找all文件,而不是找到它,并假设它必须再次创建它.

随着.PHONY您短路,文件查找逻辑,并始终假定它需要再次运行配方.

所以,基本上,你已经告诉make 总是运行链接步骤,所以make就是这样.

用这个来解决这个问题.

all: $(OUT)

$(OUT): $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)
Run Code Online (Sandbox Code Playgroud)

对于记录运行make -d和通过输出读取会指出这一点.