以下示例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 $@
答案 0 :(得分:0)
vpath
只能用于查找存在的先决条件。
使用
VPATH
查找对象目录中的源,而不是从sources目录中找到对象。
没有匹配rw_mod.o
的规则,因此obj/avpar.o
的规则失败,vpath
在先决条件规则查找期间不会添加前缀,唯一可行的方法是if { {1}}已经存在。
无论如何规则是不正确的,为什么一个目标文件依赖于另一个?