【问题标题】:Distribute compiled fortran library with module files使用模块文件分发已编译的 fortran 库
【发布时间】:2012-12-04 10:03:02
【问题描述】:

我有一个使用大量模块的Fortran 库。我在 Windows 上使用 ifort 编译器。因此,我得到了库的*.lib 文件和使用的模块的*.mod 文件。

如果我想在另一个程序中使用已编译的库,我还必须分发 *.mod 文件。如何防止这种情况?我看到了两种可能性:

  1. 创建一个接口,其中定义了用于调用库模块内的函数或过程的函数。所以,我只需要提供定义接口的文件。
  2. 在函数定义中使用bind(c) 为所有应该从库外部使用的模块函数和过程使用c 接口和导出名称。然后我可以使用类 c 的头文件分发该库。

还有其他可能吗?分发使用模块的已编译 fortran 库的最佳做法是什么?

【问题讨论】:

  • “分发”是指给自己的其他程序,还是给其他人?如果对你自己来说,那么你应该能够将 .mod 文件放在搜索路径上。如果分发给其他人,另一种解决方案是以源代码形式分发库。这会容易得多,因为您不必担心编译器版本。以编译的形式分发对您来说有多大必要?
  • 我不是代码的所有者,所以我不能分发源代码。我必须将编译好的库提供给第三方。

标签: fortran


【解决方案1】:

我认为分发.mod 文件是迄今为止最简单的,如果它应该使用从Fortran 调用的话。如果要从其他语言调用,无论如何都需要C接口。

坏事是失去了 Fortran 显式接口。如果您提供带有接口块的包含文件,则使用选项号 1 您可能仍然可以拥有它,但恕我直言,仅提供 .mod 文件更好。

【讨论】:

  • 我不知道我失去了 C 选项的显式接口。 +1!
  • 我同意提供模组是最好的。请注意,这些选项不是相互排斥的——您还可以为 BIND(C) 过程提供接口块(实际上……您必须这样做!)——您不必丢失显式接口。 BIND(C) 的问题在于您非常限制在可以是虚拟参数或函数结果的内容(所有参数必须是非可选的和可互操作的,等等)。如果提供了接口块,那么最好将它们作为源代码在模块中提供。
猜你喜欢
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2023-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多