如何使用模块为Fortran程序创建makefile

时间:2016-02-05 21:39:17

标签: module makefile fortran gfortran

挑战在于创建一个包含模块列表的makefile,并且不需要我排除优先级。例如,模块是

mod allocations.f08     mod precision definitions.f08   mod unit values.f08
mod blocks.f08          mod shared.f08                  mod parameters.f08
mod timers.f08

主程序是characterize.f08。错误消息是

Fatal Error: Can't open module file ‘mprecisiondefinitions.mod’ for reading at (1): No such file or directory

主程序中的第一个语句是use mPrecisionDefinitionsmod precision definitions.f08中定义的模块。

以下基于Creating a FORTRAN makefile的makefile是:

# compiler
FC := /usr/local/bin/gfortran

# compile flags
FCFLAGS = -g -c -Wall -Wextra -Wconversion -Og -pedantic -fcheck=bounds -fmax-errors=5
# link flags
FLFLAGS =

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

# program name
PROGRAM = a.out

all: $(PROGRAM)

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

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

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

clean:
    rm -f *.o *.mod

1 个答案:

答案 0 :(得分:9)

对于初学者,我建议用下划线或类似的东西替换文件名中的所有空格。

空间几乎普遍用作分隔符,以及任何以

之类的东西开头的程序
gfortran -c -o mod precision definitions.o mod precision definitions.f08

会将此行解释为“从源文件modprecisiondefinitions.omod和{{创建名为precision的对象文件1}}。虽然有办法实现,但随着自动化程度的提高,你必须越来越多地跳跃。

相比之下,这很有效:

definitions.f08

我会使用此命令将所有空格更改为下划线:

gfortran -c -o mod_precision_definitions.o mod_precision_definitions.f08

如果不起作用,请使用以下命令:

rename 's/ /_/g' *.f08

接下来,我不会担心for f in *.f08; do mv "$f" ${f// /_}; done 个文件。编译模块时,它们与目标文件一起生成。因此,虽然从技术上讲,使用模块的某些例程需要该模块的.mod文件,但您可以在.mod中声明它取决于目标文件本身。

所以说,这是我将使用的Makefile(添加了一些可疑的内部模块依赖项):

Makefile