2016-07-15 11 views
2

Das folgende Beispielmakefile funktioniert wie erwartet und verwendet vpath, um Objektdateien und Quelldateien zu finden. Aber in der letzten Zeile, in der ich die Abhängigkeit einer Objektdatei auf der anderen Seite erkläre, muss ich das Verzeichnis $(objd)/ der erforderlichen Datei angeben, sonst erhalte ich einen Fehler (siehe Fehlermeldung unter dem Code). Warum reicht die vpath Direktive in der letzten Zeile nicht aus?make 'vpath' Direktive, warum ist es nicht ausreichend für diese Voraussetzung?

# 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 

Das heißt, auf die letzte Zeile zu ändern:

$(objd)/$(prog).o: rw_mod.o 

gibt den Fehler:

make: *** No rule to make target 'rw_mod.o', needed by 'obj/avpar.o'. Stop. 

EDIT mit dieser Form der letzten Zeilen es tut funktionieren auch, ohne die Verzeichnisspezifikation:

#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] 

Antwort

0

vpath kann nur verwendet werden, um vorhandene Voraussetzungen zu finden.

Makefiles rule 3

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

Es gibt keine Regel, die rw_mod.o so die Regel für obj/avpar.o Spiele ausfällt, vpath nicht Sachen während Voraussetzung Regel Lookup Zierer wäre der einzige Weg, es funktioniert hier wäre, wenn obj/rw_mod.o bereits existierte.

Es ist unwahrscheinlich, dass die Regel trotzdem korrekt ist, warum würde eine Objektdatei von einer anderen abhängig sein?

+0

Ich fügte eine Klarstellung hinzu. Möglicherweise haben Sie Recht, weil die Datei nicht existiert. Auf der anderen Seite existiert keine der Dateien in der ersten Zeile der Kompilierungsanweisung, wenn sie zum ersten Mal überprüft wird. Und die Endregel ist definitiv gültig, ich denke, dass es eine ziemlich übliche Art ist, die Abhängigkeit anzugeben, ohne die Frage "vpath" zu berücksichtigen. –

+0

Nun, tatsächlich migst du richtig, dass es seltsam ist zu sagen, dass die Objektdatei von einem anderen abhängt. Tatsache ist, dass das Kompilieren zu avpar.o die Datei rw_mod.mod erfordert, die nur existiert, wenn rw_mod.o existiert, aber die Moduldateien werden separat mit den Compiler-Flags behandelt, deshalb gibt man an, dass es eine Abhängigkeit gibt auf der Objektdatei stattdessen. –