以下示例 makefile 按预期工作,vpath
用于查找目标文件和源文件。但是在最后一行中,我告诉 make 关于一个目标文件对另一个的依赖关系,我需要指定$(objd)/
先决条件文件的目录,否则我会收到错误消息(请参阅代码下方的错误消息)。为什么vpath
最后一行的指令不够?
# Program Name
prog = avpar
#dirs
objd=obj
modd=mod
# extra places to search for prerequisites
vpath %.f90 ../modules
vpath %.o obj/
# etc
FC = gfortran
flags = -I$(modd) -J$(modd) #-fopenmp
obj_files = $(prog).o rw_mod.o
# compile
p$(prog): $(obj_files)
$(FC) $(flags) $^ -o $@
$(objd)/%.o: %.f90
$(FC) $(flags) -c $< -o $@
$(objd)/$(prog).o: $(objd)/rw_mod.o
也就是说,将最后一行更改为:
$(objd)/$(prog).o: rw_mod.o
给出错误:
make: *** No rule to make target 'rw_mod.o', needed by 'obj/avpar.o'. Stop.
使用最后几行的这种形式进行编辑 ,它也可以工作,没有目录规范:
#compile
p$(prog): $(obj_files)
$(FC) $(flags) $^ -o $@
$(objd)/rw_mod.o: rw_mod.f90
$(FC) $(flags) -c $< -o $@
$(objd)/$(prog).o: $(prog).f90 rw_mod.o
$(FC) $(flags) -c $< -o $@