1

Fortran の makefile を作成しようとしています。「メイン」ファイルは 1 つですが、モジュールを別の .f90 ファイルに配置しました。添付されたメイクファイルは機能しますが、変更を加えなくても再コンパイルが必要になります。gfortan 4.7.2 と GNU Make 3.81 で x86-64 Linux を実行しています。

FC = gfortran

FCFLAGS += -ffree-line-length-none -finit-local-zero 

#FCFLAGS += -fbounds-check -ffpe-trap=invalid

all: new

new: ALE.o curvilinear.o new.o
    $(FC) $(FCFLAGS) -o new new.o ALE.o curvilinear.o

new.o: ALE.mod curvilinear.mod new.f90
    $(FC) $(FCFLAGS) -c new.f90

ALE.o: ALE.f90
    $(FC) $(FCFLAGS) -c ALE.f90

ALE.mod: ALE.o ALE.f90

curvilinear.o: ALE.o curvilinear.f90
    $(FC) $(FCFLAGS) -c curvilinear.f90

curvilinear.mod: curvilinear.o curvilinear.f90

clean:
    rm ale.mod curvilinear.mod ALE.o curvilinear.o new new.o 

出力:

$ make clean
rm ale.mod curvilinear.mod ALE.o curvilinear.o new new.o
$ make
gfortran -ffree-line-length-none -finit-local-zero  -c ALE.f90
gfortran -ffree-line-length-none -finit-local-zero  -c curvilinear.f90
gfortran -ffree-line-length-none -finit-local-zero  -c new.f90
gfortran -ffree-line-length-none -finit-local-zero  -o new new.o ALE.o curvilinear.o
$ make
gfortran -ffree-line-length-none -finit-local-zero  -c new.f90
gfortran -ffree-line-length-none -finit-local-zero  -o new new.o ALE.o curvilinear.o

変更が加えられていないのに「new」が再コンパイルされるのはなぜですか?

4

2 に答える 2

2

ディディエの答えはおそらくあなたの質問をすでに解決していますが、Fortran makefiles (1 つのメイン プログラムの例) について、すてきでクリーンな提案を追加したいと思います。

# Main program
all: program
program: mod1.o mod2.o mod3.o

# Fortran module dependencies
mod1.o: mod2.o mod3.o

# Binary/object rules
%: %.o
        $(FC) $(FCFLAGS) -o $@ $^ $(LDFLAGS)

%.o: %.f90
        $(FC) $(FCFLAGS) -c $<
于 2013-03-12T16:58:24.877 に答える
1

あなたのようMakefileに、 と にnew.o依存しALE.modますcurvilinear.mod

これらのファイルには依存関係があるため、決して存在しないと思いますが、それらを作成するルールはありません。

確かに、ビルドしようとするとnew、ファイルmakeが見つかりません。*.modしたがって、makeルールを実行してそれらを作成しますが、ルールはありません。ただし、makeそれらをビルドしたと考えて、これらの*.mod依存関係が再構築されたばかりであり、したがって最近のものであり、 の再構築をトリガーすると考えて、ビルド操作を続行しnewます。

これを修正するには、行を置き換える必要があります

new.o: ALE.mod curvilinear.mod new.f90

new.o: new.f90
于 2013-03-12T16:20:08.080 に答える