2016-07-15 66 views
2

下面的例子生成文件按预期工作,用vpath找到目标文件和源文件。但是,在最后一行,在这里我告诉做出的另外一个目标文件的依赖,我需要指定目录的前提文件$(objd)/,否则我得到一个错误(请参见下面的代码中的错误消息)。最后一行vpath指令怎么不足?make'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 [email protected] 

$(objd)/%.o: %.f90 
    $(FC) $(flags) -c $< -o [email protected] 

$(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 [email protected] 

$(objd)/rw_mod.o: rw_mod.f90 
    $(FC) $(flags) -c $< -o [email protected] 

$(objd)/$(prog).o: $(prog).f90 rw_mod.o 
    $(FC) $(flags) -c $< -o [email protected] 

回答

0

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

Makefiles rule 3

Use VPATH to locate the sources from the objects directory, not to locate the objects from the sources directory.

有没有规则匹配rw_mod.o所以obj/avpar.o的规则失败,vpath前提规则查找时不会预先考虑的东西,只是它会在这里的工作方式是,如果obj/rw_mod.o已经存在。

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

+0

我补充说明。你可能是对的,因为这个文件不存在。另一方面,首次检查时,没有任何文件存在于编译语句的第一行。最终的规则无疑是有效的,我认为这是一个相当标准的方式来陈述依赖关系,而不考虑'vpath'问题。 –

+0

呃,实际上,你认为目标文件依赖于另一个,这很奇怪。事情的事实是,编译为avpar.o需要时rw_mod.o存在只存在于文件rw_mod.mod,但该模块文件与编译器标志分开处理,所以这就是为什么一个规定是有相关性而不是目标文件。 –