私はFortran95で新しいプロジェクトを開始しました。これはすばやく大きくなるはずです(多くのモジュール)。現時点では私は大きなプロジェクト用のFORTRAN Makefile
- output.f90
- moldyn.f90
output.f90は、いくつかのパブリック変数、2つのパブリックサブルーチンと2つのプライベートサブルーチンとモジュールが含まれています。 moldyn.f90には、output.f90に含まれる2つのパブリックサブルーチンを呼び出すメインプログラムが含まれています。
私は大規模なプロジェクトに取り組むのは初めてですから、できるだけコンパイルとリンクを一般化して簡単に適応できるMakefileを作成して自動化したいと思います。これまでに作成したMakefileは、コンパイルとリンクのステートメントだけがハードコーディングされており、大規模なプロジェクトでは、プロセスを自動化したい(ただし、他のツールをCMakeとして使用しない)。
これは、残念ながら動作しません。私の試みです:
# ========
# Makefile
# ========
# Makefile name
MF = Makefile
# ==========
# Executable
# ==========
# Executable name
EXE = $(BINDIR)/moldyn.x
# ========
# Compiler
# ========
# Fortran compiler
FC = gfortran
# Fortran flags
FFLAGS = -O2 -Wall -Warray-bounds -fbounds-check
# ===========
# Directories
# ===========
SRCDIR = src
BINDIR = bin
OBJDIR = obj
MODDIR = mod
# ========
# Suffixes
# ========
.SUFFIXES:
.SUFFIXES: .f90 .o .mod
# ===================
# Sources and objects
# ===================
SRC = \
$(SRCDIR)/moldyn.f90\
$(SRCDIR)/output.f90
OBJ = $(SRC:$(SRCDIR)%.f90=$(OBJDIR)%.o)
# =====
# Rules
# =====
all:
@echo $(SRC)
@echo $(OBJ)
moldyn: $(OBJDIR)/.o $(EXE)
$(EXE): $(OBJ)
$(FC) $(FFLAGS) -o $(SRCDIR)/[email protected] $(OBJ)
$(OBJDIR)/.o:
$(FC) $(FFLAGS) -c $(SRC)
$(OBJ): $(MF)
# =======
# Folders
# =======
$(BINDIR):
mkdir -p $(BINDIR)
$(OBJDIR):
mkdir -p $(OBJDIR)
$(MODDIR):
mkdir -p $(MODDIR)
# =====
# Clean
# =====
clean:
rm -f src/*~
rm -fr $(BINDIR) $(OBJDIR) $(MODDIR)
私は混乱は、私はSRC /フォルダ内のソースを持っていると私はANでの.oを作成したいということから来ていると思いますobj /フォルダーとbin /フォルダー内の実行可能ファイル。 .modファイルはdaseフォルダ(メークファイルがあるところ)に作成されているので役割も果たしていますが、実際の扱い方はわかりません(これは私の最初のFortranプロジェクトです)。
誰でもコンパイルの問題の原因を理解できますか?私が得るエラーは、次のとおりです。
gfortran -O2 -Wall -Warray-bounds -fbounds-check -c src/moldyn.f90
src/output.f90
src/moldyn.f90:20.6:
use output, only: title, gpl
1
Fatal Error: Can't open module file 'output.mod' for reading at (1): No such file or directory
make: *** [obj/.o] Error 1
.modファイルと関連しているようです。
ディレクトリ内を見て、ファイルが置かれている場所を確認します。どのようにして* .oファイルを$(OBJDIR)に入れるのですか? * .oファイルは$(SRC)ディレクトリにあり、$(OBJDIR)ではありません。 – KeithSmith
@KeithSmith 'make all'を使って、' OBJ = $(SRC:$(SRCDIR)%.f90 = $(OBJDIR)%.O) 'というコマンドがパスをテストしたところ、期待通りに動作します。 $(OBJDIR)/と一緒に。ただし、* .oと* .modはカレントディレクトリに作成されます。 –
手作りのメークファイルは悪夢です。 CMakeは大規模なプロジェクトに適しています。私はSConsを代わりに使用します。なぜなら、私はまだ別の言語を学びたくないからSConsはちょうどPythonだからです。 –