【问题标题】:Fortran90 Makefile with pre-compilation and modules带有预编译和模块的 Fortran90 Makefile
【发布时间】:2014-10-24 13:39:50
【问题描述】:

我正在尝试编写一个 Makefile 来编译一个 Fortran90 项目,该项目由多个包含子例程和 模块 的源文件组成。为了让事情变得更复杂,我正在使用 预编译(从 *.F 文件创建 *.for 文件)。我找不到任何答案,但这可能是因为我对不同风格的 Makefile 语法感到困惑。

我创建了一个精简版本来重现我的问题(可在https://github.com/stineb/stackoverflow 上找到)。这包含一个主程序(sayhello.F),两个单独源文件中的子例程(schleppe.Fschnuppi.F),以及两个单独源文件中的模块(words_schleppe.mod.Fwords_schnuppi.mod.F)。可执行文件是hello

我可以使用简单的 Makefile 来构建它并避免预编译。这个文件(Makefile_simple)看起来像这样:

FCOM=gfortran
EXE = hello

standard: 
    $(FCOM) -c words_schleppe.mod.F
    $(FCOM) -c words_schnuppi.mod.F
    $(FCOM) -c schleppe.F
    $(FCOM) -c schnuppi.F
    $(FCOM) words_schleppe.mod.o words_schnuppi.mod.o schleppe.o schnuppi.o sayhello.F -o $(EXE)

 .PHONY: clean
 clean:
    rm $(EXE) *.o *.mod

但是,我的项目会比这个大一些,所以我想利用更复杂的 Makefile 的神秘特性来定义规则。至关重要的是:我想将源文件*.F 预编译成.for。这是我没有设法定义规则以从模块创建.mod 文件并构建整个事物的地方。忽略模块,我确实使用以下 Makefile 运行它(我的 github 存储库上的Makefile_complex):

FCOM=gfortran
CPPFLAGS=-e
COMPFLAGS=
EXE=hello
SOURCES=sayhello.F schleppe.F schnuppi.F 
OBJS=$(SOURCES:.F=.o)

all: $(OBJS)
    # this may also be replaced by the ar command (creating archive)
    $(FCOM) $(OBJS) -o $(EXE)

%.for: %.F
    rm -f $*.for
    $(FCOM) $(CPPFLAGS) $*.F > $*.for

$(OBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

# clean: remove .for, .o, .do, and .stb files
.PHONY: clean
clean:
    -rm -f *.for *.o *.stb *.mod

为了在构建中包含模块,我必须添加什么?依赖关系如下:subroutine schleppe module words_schleppe;和subroutine schnuppi module words_schnuppi.

帮忙,有人吗? 非常感谢!

【问题讨论】:

  • 如何从模块中制作.mod 文件(那些是.mod.F 文件)?这些.mod 文件如何在构建过程的其余部分中使用?
  • @EtanReisner .mod 文件由编译器在编译包含模块的源文件时自动创建。当它们遇到任何use 语句时,它们会被同一个编译器隐式使用。
  • 你的意思是编译schleppe.F会生成schleppe.for,而编译words_schleppe.mod.F会自动使用相同的编译命令生成words_schleppe.mod
  • @EtanReisner,是的,就是这样。
  • 那么我想你只想用MODS 复制关于OBJS 的部分,并添加一个%.mod: %.F 配方和匹配$(MODS): %.o: %.mod 配方(如果有必要的话)。

标签: makefile fortran fortran90 precompile pre-compilation


【解决方案1】:

我找到了解决方案!简单地说,all: 的规则必须包含模块源文件,并且这些必须在其他源文件之前。另外,必须添加从模块源文件创建目标文件的规则。工作的 Makefile 如下所示:

FCOM=gfortran

CPPFLAGS=-E
COMPFLAGS=

EXE=hello

SOURCES=sayhello.F schleppe.F schnuppi.F
MODS=words_schleppe.F words_schnuppi.F

OBJS=$(SOURCES:.F=.o)
MODOBJS=$(MODS:.F=.o)

# this may also be replaced by the ar command (creating archive)
all: $(MODOBJS) $(OBJS)
    $(FCOM) $(OBJS) $(MODOBJS) -o $(EXE)

%.for: %.F
    rm -f $*.for
    $(FCOM) $(CPPFLAGS) $*.F > $*.for

$(MODOBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

$(OBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

# clean: remove .for, .o, .do, and .stb files
.PHONY: clean
clean:
    -rm -f *.for *.o *.stb *.mod

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2021-12-20
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多