我有一个包含库API的模块,例如
module external_api
public :: func1
private
...
contains
function func1(arg1, arg2) result (r)
type(api_type1), intent(in) :: arg1
integer, intent(out) :: arg2
type(api_type2) :: r
...
end function func1
...
end module
API函数将从第三方代码调用,但我不想显示/公开库的源代码。
在C语言中,我只提供带有声明和编译库的头文件。在Fortran中,我提供了编译的.mod文件和编译库。但.mod文件是二进制格式,因此无法“读取”函数声明。
来自闭源Fortran库的API函数声明的最佳实践是什么?
答案 0 :(得分:1)
扩展我的评论,以防你想接受它。
我
的忠实粉丝因此,我建议您使用doxygen或ROBODoc之类的工具,在其中您可以在源代码中编写API ,然后自动创建一个手册页。
我强调在代码中记录API,因为必须在另一个文件/位置记录它在实践中永远不会成功。因为人们很懒惰而且不会被打扰(即使他们最初做的事情,随着时间的推移,懒惰会逐渐消失)。如果它位于例程所在的源代码中,那么它将更有可能保持最新状态。
Doxygen可以创建所有不同类型的输出。 HTML是最受支持和完善的。手册是好的,但很棒(只是被警告)。因此,您应该弄清楚如何向用户呈现API。
另一个相关的事情是,doxygen有一个\internal
关键字,表示它只是内部使用的一部分,如果您不想公开库中的所有内容,这将非常有用。然而,保持一种样式/处理方法来创建所有文档。
答案 1 :(得分:0)
Fortran语言没有带声明的头文件的概念。运送已编译模块的问题在于它们是二进制的并且(经常)特定于编译器。此外,.mod
文件中无法显示各个功能签名,需要documented
库的大多数可移植方式是仅在内部使用模块,并将入口点创建为可用于接口块的外部函数。
另一种可能性是提供包含外部API的模块的源代码。
答案 2 :(得分:-1)
这是一个问题... forfor中有16字节浮点格式值的fortran模块中有libquadmath0。这是一个float128类型。所以我想在C程序中使用它。但是不能...我没有其他模块,只有fortran。如果我想在fortran中工作,则不需要此模块,因为如果fortran提供了这种类型的支持,那么您就不需要此模块。因此,您可以毫无问题地使用它。我们可能会立即进行计算,而没有其他必要。但是,如果您想读写字符串,则可以调用fortran读写命令。支持。所以像pascal这样的fortran字符串不是相同的C字符串。您需要转换。问题是...所以有很多float128类型的函数。这里没有支持,但是在fortran中。在汇编器中手动编写此模块的另一种方法。设置标志协处理器会得到所需的行为。但是您不会转换为字符串函数。不幸的是,并非所有的OS Linux在C支持中都具有此模块。它不支持OpenSuse Leap 15.0。可能也是thumblrweed。我不测试x586架构,但不测试x86_64。 Fedora和其他一些是。但是在OS OS版本中,Linux具有一些优势。您可以使用gmp lib。没有问题。但是这是一个糟糕的解决方案,因此没有理由对协处理器支持的类型使用特殊的lib。