2

次の質問があります。Fortran90 ソース ファイルのセットがあり、そのほとんどにモジュールが含まれています。それらから静的ライブラリ (.a) を構築する必要があり、次の Makefile を使用しました。

.SUFFIXES: .o .c .f90 .f .mod

DEPSF =   tt_f90m, bt
include Makefile.in #Contains compiler flags (CC, FORT, etc.)
OBJS    = $(DEPSF:,=.o).o

mytt.a: $(OBJS) 
 ar rc mytt.a $(OBJS)
.f90.o:
    $(FORT) -c $<

正常に動作しますが、面倒な機能があります。ソース ファイルのいずれかを編集すると、mytt.a ターゲットが再構築されません。すべての .o および .mod ファイルを削除した場合にのみ発生します。make -d の出力

以下のとおりであります:

....


Considering target file `tt_f90m.o'.
....   
Found an implicit rule for `tt_f90m.o'.
Considering target file `tt_f90m.mod'.
 Looking for an implicit rule for `tt_f90m.mod'.
....
 No implicit rule found for `tt_f90m.mod'.
 Finished prerequisites of target file `tt_f90m.mod'.
No need to remake target `tt_f90m.mod'.
Finished prerequisites of target file `tt_f90m.o'.
Prerequisite `tt_f90m.mod' is older than target `tt_f90m.o'.
No need to remake target `tt_f90m.o'.

このメイクファイルを正しく記述するにはどうすればよいですか?

4

2 に答える 2

2

実際、私はこの質問に対する答えを持っています。問題は Fortran90 にありました。依存関係として .mod ファイルがあるため、ソース ファイルが変更されても .mod ファイルは変更されず、ファイルは再コンパイルされません。解決策は非常に簡単です。最初は書くだけ

.SUFFIXES:
.SUFFIXES: .c .f .f90 .F90 .o

そしてそれだけです!

于 2012-06-16T08:14:52.890 に答える
1

.f90.fファイルのファイルへの依存関係をメイクファイルに入れていません.mod.f.modまたはで終わるファイルの 1 つを更新すると.c、make はファイルがその.aファイルに依存していることを認識せず、わざわざ.f90ファイルを再コンパイルしません。

これを修正するには、いくつかのオプションがあります。1 つは、 makedependなどのツールを使用することです。Makedepend 自体は C でのみ機能しますが、Fortran のバージョンが存在します。

もう 1 つは、どのオブジェクト ファイルがどのモジュールと C ファイルに依存するかをメイクファイルに明示的に記述することです。次のようになります。

.SUFFIXES: .o .c .f90 .f .mod

DEPSF =   tt_f90m, bt
include Makefile.in #Contains compiler flags (CC, FORT, etc.)
OBJS    = $(DEPSF:,=.o).o

mytt.a: $(OBJS) 
    ar rc mytt.a $(OBJS)

ttf90m.o: bt.f90 foo.mod bar.f
    $(FORT) -c $< -o $@

bt.o: ttf90m.f90 baz.mod floop.c
    $(FORT) -c $< -o $@    
于 2012-05-19T23:15:15.253 に答える