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

Avoid linking and compiling in Make if not needed

本文关键字:链接 编译 Make 不需要 如果不 如果      更新时间:2023-10-16

作为这里的后续问题:即使代码中没有任何更改,我的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)文件。检查此答案以获得有关.PHONY的提醒。(您违反了Makefiles的第二条规则。)

因此,运行make的第二次/etc/make(假设.PHONY标记不存在)将查找all文件,但找不到它,并假设它必须再次创建它。

使用.PHONY,您可以缩短文件查找逻辑,并使始终假设它需要再次运行配方。

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

用这个来解决这个问题。

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

对于运行make -d并读取输出的记录,会向您指出这一点。

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

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