3

以下示例 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 $@
4

1 回答 1

1

vpath只能用于查找存在的先决条件。

Makefile 规则 3

用于VPATH从对象目录中查找源,而不是从源目录中查找对象。

没有匹配的规则,因此失败rw_mod.o的规则不会在先决条件规则查找期间添加东西,它在这里工作的唯一方法是如果已经存在。obj/avpar.ovpathobj/rw_mod.o

无论如何,规则不太可能是正确的,为什么一个目标文件依赖于另一个?

于 2016-07-15T22:35:55.203 回答