【问题标题】:Module "header" in FortranFortran 中的模块“标题”
【发布时间】:2014-03-18 11:06:45
【问题描述】:

我有一个包含库 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 函数将从 3rd 方代码调用,但我不想显示/公开库的源代码。

在 C 语言中,我只需提供一个带有声明和编译库的头文件。在 Fortran 中,我提供编译的 .mod 文件和编译的库。但是 .mod 文件是一种二进制格式,因此无法“读取”函数的声明。

从闭源 Fortran 库中声明 API 函数的最佳做法是什么?

【问题讨论】:

  • 使用哪个编译器?
  • 我试着问一般情况,但我通常需要 Linux 和 Windows 以及 Intel Fortran 和 gfortran
  • 您通常可以为特定编译器提供 mod 文件
  • 你的意思是编译的 .mod 文件?这些是二进制的,所以它们对编译器很好,但很难被人类阅读。我的问题是给那些试图编写调用库 API 的代码的人什么。 (显然可以提供文档,但这与 C-header 并不完全相同)
  • 如何记录您的代码?使用类似Doxygen 的东西。然后生成包含您的已发布 API 的手册页(或其他)。就像您的C 示例一样,您可以阅读/usr/include/string.hman strcat(例如)。只是一个想法。

标签: c fortran header-files


【解决方案1】:

扩展我的评论,以防你想接受它。

我是

忠实粉丝
  • 记录代码
  • 创建手册页

因此,我建议您使用doxygenROBODoc 之类的工具,您可以在其中源代码中编写您的API,然后自动创建手册页。

我强调在代码中记录 API,因为必须在另一个文件/位置记录它在实践中永远不会奏效。由于人们很懒惰并且不会被打扰(即使他们最初这样做,随着时间的推移,懒惰也会蔓延)。如果它位于例程所在的源代码中,那么您将有更大的机会使其保持最新。

Doxygen 可以创建所有不同类型的输出。 HTML 是最受支持和最完善的。手册页还可以,但很棒(请注意)。所以你应该弄清楚你将如何向用户展示 API。

另一件相关的事情是,doxygen 有一个 \internal 关键字,表示它只是内部使用的一部分,如果您不想公开库中的所有内容,这将很有帮助。然而,保持一种样式/处理方法来创建您的所有文档。

【讨论】:

    【解决方案2】:

    Fortran 语言没有带有声明的头文件的概念。运送已编译模块的问题在于它们是二进制的并且(经常)特定于编译器。此外,各个函数签名在 .mod 文件中不可见,需要为 documented

    对于库来说,最可移植的方式是仅在内部使用模块,并将入口点创建为可以使用接口块的外部函数。

    另一种可能性是提供包含外部 API 的模块的源代码。

    【讨论】:

      【解决方案3】:

      这是一个问题......我们在 fortran 中有模块 libquadmath0 用于 fork 具有 16 字节浮点格式值。它是一个 float128 类型。所以我想在C程序中使用它。但不能......我没有像只有fortran这样的其他模块。如果我想在 fortran 中工作,我不需要这个模块,因为如果 fortran 提供这种类型的支持,你就不需要这个模块。所以你可以毫无问题地使用它。我们可以立即进行的计算,其他不需要。但是如果你想要读|写字符串,你可以调用 fortran 读写命令。支持。所以像pascal这样的fortran字符串不是同一个C字符串。你需要转换。交易是......所以有很多float128类型的功能。这里不支持,但在 fortran 中支持。在汇编程序中手动编写此模块的另一种方法。设置标志协处理器可以获得所需的行为。但是您不会转换为字符串函数。不幸的是,并非所有 OS Linux 都支持 C 语言中的这个模块。它是 OpenSuse Leap 15.0 不支持。也可能是拇指草。我不测试 x586 架构,但 x86_64 没有。 Fedora 和其他一些是。但是在版本 OS Linux 中是一些海豚 dsiadvantages。您可以使用 gmp 库。没有问题。但这是不好的解决方案,所以没有理由为协处理器支持的类型使用特殊的库。

      【讨论】:

      • 我觉得这个答案很混乱。明确说明您的解决方案并明确说明其优缺点是个好主意。
      • 我不明白你在说什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多