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