首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autotools和Fortran模块

Autotools和Fortran模块
EN

Stack Overflow用户
提问于 2021-05-10 00:36:42
回答 1查看 110关注 0票数 1

我在编写一个Makefile.am时遇到了问题,它可以让autotools按照正确的顺序编译文件。

我的最小示例是一些使用模块mod.f90中的例程的test.f90。通过手工,我完成了以下操作。

代码语言:javascript
复制
gfortran -c mod.f90
gfortran -c test.f90
gfortran -o test test.o mod.o

这可以很好地工作。现在,我读到autotools不处理Fortran模块依赖,根据这篇文章(automake with fortran: order of file),人们应该手动将依赖放到Makefile.am中。

我的代码如下所示。

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = test
test_SOURCES = mod.f90 test.f90 
test: test.f90 mod.o
mod.o: mod.f90

虽然模块的.mod文件是在我每次运行./configure && make时生成的,但它显然不是在所有其他文件之前生成的,也就是说,我仍然收到错误消息Fatal Error: Cannot open module file ‘mod.mod’ for reading at (1): No such file or directory

连续运行两次./configure && make允许编译程序,但当然这并不是一个真正令人满意的解决方案。有什么标准的方法来处理这个问题吗?我是否可以以某种方式强制在test.o之前编译mod.o

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 22:09:03

根据第一行,这两行中的第二行是多余的:

test_SOURCES = mod.f90 test.f90测试: test.f90 mod.o

这是不必要的,因为Automake (和GNU make)已经知道它所传达的信息:

mod.o: mod.f90

这实际上给你留下了这样的结果:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = test
test_SOURCES = mod.f90 test.f90

就它而言,这是可以的,但它不表达与mod.mod文件相关的任何依赖信息,因此构建可能会失败。要解决这个问题,您需要添加一个或多个规则来表达附加依赖关系以及如何满足这些依赖关系。

真正的依赖关系是test.o依赖于mod.mod,您可以编写一个仅依赖关系的规则来表达这一点:

代码语言:javascript
复制
# INSUFFICIENT
test.o: mod.mod

但这给您留下了一个问题:make不知道mod.modmod.f90编译的输出。实际上,通过一个配方的一次运行创建多个目标的情况对于make (和Automake)来说是有问题的。Automake手册中的one of its lengthier sections专门介绍了这个问题。最健壮的构建系统将使用该部分描述的方法来表达如何构建mod.omod.mod,但这将是Makefile.am的三倍大小,并且您将需要为每个Fortran模块编写类似的额外代码。

您可以通过告诉Automake test.o依赖于mod.o来实现一个相当好的解决方法

代码语言:javascript
复制
# Better
test.o: mod.o

这将从零开始生成成功的构建,并且在大多数正常的开发环境下,但它确实表达了不正确的依赖关系。因此,例如,通过构建项目,然后删除mod.mod (保留mod.o )和更新test.f90,很容易造成破坏。在随后的构建中,make将看到mod.o是最新的,因此它不会重新生成丢失的mod.mod。干净的构建将拯救这种情况,作为一名开发人员,为了Makefile.am的简单性,我可能会准备接受这种情况。

说到干净的构建,您还应该将mod.mod添加到make clean应该删除的文件列表中:

代码语言:javascript
复制
CLEANFILES = mod.mod

总体而言,最终结果是:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = test

test_SOURCES = mod.f90 test.f90

# A fib -- the real dependency is test.o: mod.mod
test.o: mod.o

CLEANFILES = mod.mod
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67460091

复制
相关文章

相似问题

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