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,但該模塊文件與編譯器標誌分開處理,所以這就是爲什麼一個規定是有相關性而不是目標文件。 –