挑战在于创建一个包含模块列表的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 mPrecisionDefinitions
,mod 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
答案 0 :(得分:9)
对于初学者,我建议用下划线或类似的东西替换文件名中的所有空格。
空间几乎普遍用作分隔符,以及任何以
之类的东西开头的程序gfortran -c -o mod precision definitions.o mod precision definitions.f08
会将此行解释为“从源文件mod
,precision
,definitions.o
,mod
和{{创建名为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