我正在使用 gfortran 的 95+ 扩展。我有一个实用程序模块库,我想链接到其他项目,即作为库或共享对象/dll。但是,在 Fortran 中,我不明白如何在不维护模块接口的两个副本的情况下将接口与 Fortran 中的实现分离。
在 C 中,我会将接口与实现分开,例如:
api.h ←includes← impl.h
↑ ↑
includes includes
↑ ↑
user.c impl.c
有没有办法在现代 Fortran 中达到同样的效果?我是否需要向用户提供我的库的 .mod 文件?
Edit:总结一下(我认为的)答案:
需要 .mod 文件,因为它们包含显式接口定义
模块没有标准的 Fortran ABI - .mod 文件将是特定于编译器的
解决实现隐藏问题的唯一直接类似的方法是子模块,它在 Fortran 2008 中定义,但 gfortran 不支持。
除了避免使用模块(@High-Performance-Mark 和 Fedora 页面指出的)之外,最实用的方法是分发仅接口模块的包含文件以及用于实现的预编译 .mod。
使用包含会产生一些众所周知且烦人的错误,包括可能重新定义公共块。
我有点惊讶这里实际上没有一个简单的答案。
我相信你可以做到这一点子模块 http://fortranwiki.org/fortran/show/Submodules使用 Fortran 2008 编译器。来自 Fortran 维基:
子模块是 Fortran 2008 的一项功能,它允许模块过程在模块中定义其接口,同时在单独的单元(子模块)中定义过程主体。
From 维基百科 http://en.wikipedia.org/wiki/Fortran(强调我的)
[子模块允许]模块的规范和实现以单独的程序单元表示,这改进了大型库的打包,允许在发布明确接口的同时保留商业秘密,并防止编译级联。
我对子模块没有任何经验,而且它们还没有得到广泛支持,但它们是需要注意的。
Edit由于许多编译器不支持子模块,因此讨论其他选项可能会有所帮助。
这一页 http://jblevins.org/log/library-distribution问了一个与此类似的问题,并且有许多不错的链接。在 Google 网上论坛的讨论中特别有用(特别参见,这个帖子 https://groups.google.com/d/msg/comp.lang.fortran/3mpu5fNgK9I/m-XL2mXIT3AJ)。总之,一种选择是:
-
将所有库函数/子例程分组在一个文件中并单独分组(即不属于模块的一部分)。
-
创建一个仅包含要向最终用户公开的子例程的接口的模块。
-
向最终用户提供编译后的模块和库。然后用户可以use
他/她的程序中的模块并链接到库。
这允许您“隐藏”您不想向最终用户公开的函数/子例程。
从我链接到的帖子中摘取:
某些编译器会生成 .mod(或编译器赋予它的任何名称)文件和库文件。 .mod 文件具有符号;库文件包含模块中包含的可执行代码。在这种情况下,您必须将这两个文件分发给最终用户。
此外,某些编译器(特别是 f95)将符号和可执行代码放入单个 .mod 文件中。在这种情况下,您只需向最终用户提供 .mod 文件。
(最终!)编辑有一个有用的页面 http://fedoraproject.org/wiki/PackagingDrafts/FortranLibraries在 Fedora 维基上:
理想情况下,可移植的 Fortran 库将避免使用模块。好消息是已经定义了子模块规范,这将允许模块的接口规范部分与过程源代码分开。当它在 Fortran 编译器中实现时,它应该被所有打包库使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)