首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有预编译和模块的Fortran90生成文件

带有预编译和模块的Fortran90生成文件
EN

Stack Overflow用户
提问于 2014-10-24 13:39:50
回答 1查看 1.9K关注 0票数 0

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

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

我可以用一个简单的Makefile来构建它,避免预编译。此文件(Makefile_simple)如下所示:

代码语言:javascript
复制
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)运行它:

代码语言:javascript
复制
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

有人帮忙吗?谢谢一堆人!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-25 23:17:03

我找到解决办法了!简单地说,all:的规则必须包括模块源文件,而这些必须在之前包含其他源文件。此外,必须添加从模块源文件创建对象文件的规则。正在工作的Makefile如下所示:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26549066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档