【问题标题】:When creating a Fortran 90 shared library, how can arrange it so that I can access the modules the library uses?创建 Fortran 90 共享库时,如何安排它以便我可以访问库使用的模块?
【发布时间】:2014-05-21 18:23:59
【问题描述】:

我正在创建一个 Fortran 90 共享库及其 Python 绑定。我需要对其进行调整,以便用户在同时使用 Fortran 和 Python 时可以访问共享库的模块。

Python 部分很简单,我将创建签名文件并使用f2py。然后这些模块将是普遍可访问的。

但是,用户还需要在 Fortran 中访问这些模块。为此,用户将需要.mod 文件。

  • 我不愿意分发.mod 文件并与库一起安装,因为它是非正统的。
  • 我也不想让用户每次需要访问一个定义模块的文件时都将其复制到他们自己的项目中。

说我正在使用NumPy 的构建系统也很有用,它利用了 Python。特别是numpy.distutils

所以这是我的解决方案:

  • 我将在头文件中定义模块,每个模块一个头文件。
  • 在库本身的编译过程中,对于每个头文件foo.h,在src/modules中都会有一个对应的foo.90包含一行:
包括'foo.h'

这样,库就可以访问模块。

  • 对于用户来说,在使用库时,如果用户想要访问模块foo,用户将包含该行
包括'foo.h'

一次,在他们想要的任何文件中。这样.mod 文件将在用户自己的目录中生成,并且项目将被编译,使用户可以访问模块所在的内存部分。

这看起来合理吗?有没有其他你知道的更好、更少hacky的方法(不涉及.mod文件的分发)?

【问题讨论】:

  • 如果您分发 Fortran 代码本身,用户可以通过编译代码来创建自己的 .mod 文件。您不想分发代码?
  • @Fortranner 我会分发它,但根据我的设计,用户不必在项目内重新编译库文件,或引用共享库以外的二进制文件,如mod文件。

标签: fortran fortran90


【解决方案1】:

您绝对不想分发 .mod 文件,因为它们会随着编译器甚至编译器版本而变化。由于您愿意分发源代码,我认为最简单的解决方案是将您的代码放在某个特定目录中,并向用户提供在他们的代码中包含 use XYZ 的说明以及如何使用他们的代码编译该模块的说明,也许提供一个示例 Make 或命令文件。如果您想最小化它们编译的代码,您可以编写一个特殊的模块,其中包含描述您的过程的接口。这种方法产生了维护接口与程序一致的维护负担。当然,如果您要更改过程的参数,它会影响用户的代码,所以也许您永远不会这样做。

【讨论】:

  • 这就是我所描述和想到的。但是,更改 api 不会给用户带来太多麻烦,因为 api 包含一些用户必须重新定义的 3-4 个子例程,以便将库与他们自己的程序一起使用。他们不会改变。在该范围之外进行的任何一致更改几乎都不会影响用户及其程序。因此,我将此答案作为对我的想法的确认,并据此进行。
  • 如果用户只需要访问少量子例程,它会变得更容易。您可以为这些子例程创建一个带有接口的特殊模块,也可以将模块分为两个,一个带有用户需要直接调用的例程,他们可以编译以获得模块文件,另一个带有库仅由用户间接调用且不需要模块信息的例程。
猜你喜欢
  • 2010-11-07
  • 1970-01-01
  • 2016-09-08
  • 2011-01-09
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多