web-dev-qa-db-ja.com

FORTRANメイクファイルの作成

多くの異なる.Fファイルと.hファイルで構成されるFORTRANソースコードがあります。それから実行可能ファイルをビルドする必要がありますが、いくつか問題があります。これまでに作成したメイクファイル(これは初めてなのでエラーが発生する可能性があります)は次のとおりです。

 # compiler
 FC = /usr/bin/gfortran-4.5

 # compile flags
 FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons
 # link flags
 FLFLAGS = -g -fbacktrace

 # source files and objects
 SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) \
        $(patsubst %.h, %.mod, $(wildcard *.h))

 # program name
 PROGRAM = blah

 all: $(PROGRAM)

 $(PROGRAM): $(SRCS)
    $(FC) $(FCFLAGS) $@ $<

 %.o: %.F
    $(FC) $(FLFLAGS) -o $@ $<

 %.mod: %.h
    $(FC) $(FLFLAGS) -o $@ $<

 clean:
    rm -f *.o *.mod

しかし、プログラムを作成しようとすると、未定義の参照エラーが多数発生します。つまり、最初にコンパイルされた.Fファイル内のすべての関数とサブルーチンの呼び出しは、未定義の参照エラーを返します。これは、gfortranがファイルをコンパイルして最後にリンクするのではなく、ファイルをリンクしようとしたためだと思いましたが、「-c」オプションを使用するとそれを防ぐことができると思いました。

更新:

コメント提供者が指摘しているように、私はコンパイルフラグとリンクフラグを混同しました。さらに、*。hファイルをコンパイルしないでください。これが最新の修正されたmakefileです:

# compiler
FC = /usr/bin/gfortran-4.4

# compile flags
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check -std=legacy
# link flags
FLFLAGS =

# source files and objects
SRCS = $(patsubst %.F, %.o, $(wildcard *.F))

# program name
PROGRAM = blah

all: $(PROGRAM)

$(PROGRAM): $(SRCS)
    $(FC) $(FLFLAGS) -o $@ $<

%.o: %.F
    $(FC) $(FCFLAGS) -o $@ $<

clean:
    rm -f *.o *.mod

Makeを実行すると、コード内の各* .Fファイルがコンパイルされますが、リンク段階で失敗します。最初の* .Fファイルに未定義の参照エラーがたくさんあります。コンパイラは、リンク段階で各* .Fファイルを個別に調べているようですが、これが正しいかどうかはわかりません。次に、エラーが発生します。

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/libgfortranbegin.a(fmain.o): In function `main':
(.text+0x26): undefined reference to `MAIN__'
collect2: ld returned 1 exit status

ただし、次のコマンドを入力すると、次のようになります。

gfortran -o blah *.o

実行可能ファイルがビルドされるので、リンク段階のメイクファイルで何か問題があったようです。

更新:2011年5月9日

Sverreは、私のmakefileの最後の問題を指摘しました。プログラムをビルドする最初のターゲットでは、最初の依存関係($ <)に対してのみショートカットコマンドを使用しますが、($ ^)ショートカットを使用してすべての依存関係(つまり、すべての* .oファイル)を含める必要があります。最終的に機能するmakefileは次のとおりです。

# compiler
FC      := /usr/bin/gfortran-4.5

# compile flags
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check
# link flags
FLFLAGS =

# source files and objects
SRCS = $(patsubst %.F, %.o, $(wildcard *.F))
#       $(patsubst %.h, %.mod, $(wildcard *.h))

# program name
PROGRAM = vipre

all: $(PROGRAM)

$(PROGRAM): $(SRCS)
    $(FC) $(FLFLAGS) -o $@ $^

%.o: %.F
    $(FC) $(FCFLAGS) -o $@ $<

# %.mod: %.h
# $(FC) $(FCFLAGS) -o $@ $<

clean:
    rm -f *.o *.mod
16
Bob

GNU makeを使用していますか?使用している場合は、

$(FC) $(FLFLAGS) -o $@ $<

犯人かもしれません。 $<first前提条件の名前ですが、すべての*.oファイルが必要です。代わりに$^を使用してみてください。

14
sverre