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]
我补充说明。你可能是对的,因为这个文件不存在。另一方面,首次检查时,没有任何文件存在于编译语句的第一行。最终的规则无疑是有效的,我认为这是一个相当标准的方式来陈述依赖关系,而不考虑'vpath'问题。 –
呃,实际上,你认为目标文件依赖于另一个,这很奇怪。事情的事实是,编译为avpar.o需要时rw_mod.o存在只存在于文件rw_mod.mod,但该模块文件与编译器标志分开处理,所以这就是为什么一个规定是有相关性而不是目标文件。 –