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]
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. –
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. –