【问题标题】:Is it possible to determine which Fortran compiler generated a ".mod" file?是否可以确定哪个 Fortran 编译器生成了“.mod”文件?
【发布时间】:2016-06-07 13:47:29
【问题描述】:

假设我的机器上已经安装了一个包,我想知道是否需要重新生成模块包含文件 (.mod) 以使它们与我的其余编译兼容。有没有办法做到这一点?

【问题讨论】:

  • 当然没有 Fortran 标准的方法可以做到这一点,.mod 文件在标准中没有提到(也没有很多其他的)。现在.mod 文件的形式和内容是特定于实现的,几乎没有文档记录。我想您可能可以用编辑器在其中四处寻找,并且可能能够找到您想要的内容,并且我猜您的编译器可能会选择将编译器信息插入到 .mod 文件中。我想您可以在弄清楚这一切的同时多次重新创建它们...
  • 感谢您的回复。我遇到了很多情况,我觉得需要这些信息。正如您所提到的,它们似乎取决于编译器类型和版本。当然,最终可以使用通用编译器重新编译所有内容,但有时会很乏味。

标签: module compilation fortran


【解决方案1】:

如果模块是使用 gfortran 构建的,那么在 mod 文件上使用字符串(在 Linux 上)将提供编译器名称和版本号。但是,对于 Intel,strings 命令只会显示编译器版本号。

【讨论】:

  • 感谢您的回复。正如马克在 cmets 中提到的那样,这个想法似乎是在文件中打印可读字符。我用gfortran-4.8.2检查了它,它返回了GFORTRAN module version 10 created from file.f90。 10 指的是什么?正如你所提到的,对于英特尔,它只返回了一个大概是版本的数字......我试图找到更可靠的方法,这显然是不可用的。
  • @Amir 模块版本号不是很清楚。对于 gfortran-4.6.3,它是 6,对于 gfortran-4.8.2,它是 10。在 gfortran 网站 https://gcc.gnu.org/wiki/GFortran/News 上,它声明 Module files: The version of the module files (.mod) has been incremented. Fortran MODULEs compiled by earlier GCC versions have to be recompiled, when they are USEd by files compiled with GCC 4.8, because GCC 4.8 is not able to read .mod file of earlier GCC versions; attempting to do so gives an error message.
  • 据我尝试,strings some_module.mod 的方法不会为 gfortran 7.2.0 创建的 mod 文件返回有意义的字符串(而它为 gfortran 4.8 提供)。事实上,gcc.gnu.org/wiki/GFortran/News 中 4.9 版的发布 cmets 表示“此外,模块文件现在已压缩”。有没有办法从最新版本的 gfortran 生成的 mod 文件中提取类似“GFORTRAN 模块版本 '10' created from ..”的消息?
  • @norio 提出了一个重要的观点。我尝试使用字符串,并得到一堆垃圾字符。有谁知道克服这个问题的方法吗?
【解决方案2】:

我在库和模块文件的某些时候遇到了类似的问题,但没有源。因为在某些情况下,获得正确的编译器比获得重新编译的源代码更容易,或者只重新编译 OP 提到的少数东西,我发现在 SO 上的某个地方获得 gfortran 模块的版本控制很有用。不幸的是,信息不容易找到,因此需要进行逆向工程,欢迎任何人编辑和添加更多内容。

我做了一点谷歌搜索,这是起点: 对于 gfortran,根据this page,模块版本控制出现在“gfortran 4.4”中。重要的是要说版本号是针对模块而不是针对编译器的。我猜当模块文件的格式发生变化以适应一些新功能时,它会发生变化。

通过结合来自this pagethis pagesthis one 的信息以及来自 matthieu-verstraete 的答案,我得出了这份通信清单。

GCC version    module file version
-----------------------------------
up to 4.3.2    unversioned
4.4            0
4.5.1          4
4.6.3          6
4.7.0pre       8
4.7.1          9
4.8.[1-3]      10
4.9.2          12
5.1.0          14
8.1.0          15 
9              15
10             15
11             15

4.8 版本开始,gfortran 团队会在模块版本更改时在发行说明中包含一条小消息。消息看起来像

模块文件:模块文件 (.mod) 的版本已递增

因为它可以从this link 读取。他们没有给出版本号,似乎当他们说递增时,它增加了2。 gfortran 版本 8 中模块版本的更新增加了 1,并且 [gfortran wiki] 5 在撰写本文时没有说明任何内容。感谢 matthieu-verstraete 挖掘它。

【讨论】:

    【解决方案3】:

    对于最近的 gfortran 版本:

    1. cp mymodule.mod test.mod.gz
    2. gunzip test.mod.gz
    3. 读取文件 test.mod - 第一行将包含模块版本,这是 gfortran 开发人员的内部计数器。请参阅上面的帖子以获取对应列表。对于 gfort 8.1.0,我们的版本是 15。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多