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

作为here的后续问题:即使代码中没有任何更改,我的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

解决方法:

问题是你的目标.它不会生成所有(并标记为.PHONY)文件.检查此answer以获取有关.PHONY的提醒. (你违反了第二个Rule of Makefiles.)

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

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

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

用这个来解决这个问题.

all: $(OUT)

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

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

上一篇:C模板的模板无法编译


下一篇:java – 使用dex2jar和jd-gui编辑后构建.APK?