3

次の 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 $@
4

1 に答える 1