次の makefile の例は、vpath
オブジェクト ファイルとソース ファイルの検索に使用して、期待どおりに機能します。しかし、あるオブジェクト ファイルが別のオブジェクト ファイルに依存していることを make に伝える最後の行では$(objd)/
、前提条件ファイルのディレクトリを指定する必要があります。そうしないと、エラーが発生します (コードの下のエラー メッセージを参照)。最後の行の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 $@
$(objd)/%.o: %.f90
$(FC) $(flags) -c $< -o $@
$(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 $@
$(objd)/rw_mod.o: rw_mod.f90
$(FC) $(flags) -c $< -o $@
$(objd)/$(prog).o: $(prog).f90 rw_mod.o
$(FC) $(flags) -c $< -o $@