【发布时间】:2016-07-08 22:23:52
【问题描述】:
我在 Fortran95 中开始了一个新项目,该项目应该很快就会变大(很多模块)。目前我只有
- 输出.f90
- moldyn.f90
output.f90 包含一个带有几个公共变量、两个公共子例程和两个私有子例程的模块。 Moldyn.f90 包含调用 output.f90 中包含的两个公共子例程的主程序。
这是我第一次处理大型项目,因此我想通过创建一个通用且易于调整的 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)/$@ $(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/ 文件夹中有源代码,我想在 obj/ 文件夹中创建 .o 并在 bin/ 文件夹中创建可执行文件。 .mod 文件也起作用,因为它们是在 dase 文件夹中创建的(那里有 makefile),但我真的不知道如何处理它们(这是我的第一个 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 使用
make all我测试了路径,命令OBJ = $(SRC:$(SRCDIR)%.f90=$(OBJDIR)%.o)按预期工作,即OBJ 中的值都以$(OBJDIR)/ 开头。但是 *.o 和 *.mod 是在当前目录中创建的。 -
手工制作的 Makefile 是一场噩梦。 CMake 是大型项目的不错选择。我改用 SCons,因为我不想再学习另一种语言,而 SCons 只是 Python。
标签: makefile compiler-errors fortran gnu-make linker-errors