我正在使用 gfortran 的 95+ 扩展。我有一个实用模块库,我想链接到其他项目,即作为库或共享对象/dll。但是,在 Fortran 中,我不明白如何在不维护模块接口的两个副本的情况下将接口与 Fortran 中的实现分开。
在 C 中,我会将接口与实现分开,例如:
api.h ←includes← impl.h
↑ ↑
includes includes
↑ ↑
user.c impl.c
有没有办法在现代 Fortran 中实现相同的效果?我是否需要向我的库中的用户提供 .mod 文件?
- 显式接口的单一定义
- 只有接口定义暴露给用户代码
编辑:总结(我认为是)答案:
需要 .mod 文件,因为它们包含显式接口定义
模块没有标准的 Fortran ABI——.mod 文件将是特定于编译器的
实现隐藏问题的唯一直接类似方法是子模块,它在 Fortran 2008 中定义,gfortran 不支持。
除了 @High-Performance-Mark 和 Fedora 页面指出的避免模块之外,最实用的方法是分发仅接口模块的包含文件以及用于实现的预编译 .mods。
使用包含有一些众所周知且令人讨厌的问题,包括可能重新定义常见块。
我有点惊讶这里实际上没有一个简单的答案。