【问题标题】:The mysterious nature of Fortran 90 modulesFortran 90 模块的神秘本质
【发布时间】:2012-08-31 15:59:42
【问题描述】:

Fortran 90 模块是短暂的生物。我使用了一段时间的(单一)模块并取得了一些成功(使用 Intel Visual Fortran 和 Visual Studio 2010 进行编译)。然后我写了另一个模块并尝试在另一个函数中使用它,然后收到此错误:

 error #7002: Error in opening the compiled module file.  Check INCLUDE paths.

所以我删除了有问题的模块。但是现在我在尝试访问我的原始模块后收到同样的错误!

我怎样才能找到这些神秘的生物?为什么一个模块可以工作而不是两个?我假设我需要删除并重新编译它们,或者告诉编译器以某种方式包含它们。我知道源代码的文件位置,但不知道它们编译到的位置。

【问题讨论】:

    标签: visual-studio-2010 fortran fortran90 fortran95 intel-fortran


    【解决方案1】:

    对于特定的处理器(许多其他 Fortran 处理器具有类似的特性,但细节不同):

    • 成功编译模块后,编译器会生成一个 .mod 文件(也可能是一个 .obj 文件),其中包含有关模块提供的实体的信息。您引用的错误消息所指的是这个 mod 文件。编译器在编译其他源代码时遇到模块的 USE 语句时需要此 mod 文件。 (链接阶段使用obj文件。)

    • 因此,在使用模块之前,编译器必须在某个时间编译模块的源代码。这意味着模块的源代码 (MODULE...END MODULE) 必须在源文件中出现在 USE 语句之前,或者必须在一个单独的文件中,该文件在源文件之前使用 USE 语句编译。

    • 在 Visual Studio 中使用英特尔 Fortran 项目进行编译时,构建环境将自动尝试为项目中的源文件安排适当的编译顺序。从命令行使用 ifort 命令编译时,程序员负责管理编译顺序。

    • 接收生成的 mod 文件的目录由提供给编译器的第一个 /module 命令行选项指定。在 Visual Studio 中,此选项是使用 Fortran > 输出文件 > 模块路径属性设置的。默认情况下,Visual Studio 中的 Fortran 项目将此属性设置为当前配置的名称,因此 mod 文件出现在名为 Debug 或 Release 的项目的子目录中。在没有 /module 命令行选项的情况下,mod 文件出现在当前目录中。

    • /module 命令行选项(或等效的 Visual Studio 属性)指定的目录也用于搜索 mod 文件。此外,还会搜索 /I 命令行选项指定的目录(在 Visual Studio 中,Fortran > 常规 > 附加包含目录)。

    从您的问题中不清楚您是如何在源文件中分发模块的,无论您有一个 Visual Studio 项目还是多个项目等。如果您只处理一个项目,那么通常所有这些都是required 是将所有 Fortran 文件添加到项目的源文件中,默认设置应该“有效”。查找mod文件出错可能是因为:

    • 模块的关联源不在项目的源文件之一中;

    • 某个模块的源代码编译因其他原因而失败(是否在构建序列前面列出了其他错误?)

    • 一个模块是在一个特定的源文件中使用后定义的;

    • 模块之间存在循环依赖(模块 A 使用模块 B,模块 B 使用 A 或类似的 - 这是语言规则所不允许的);

    • 一些源代码结构混淆了构建顺序的自动确定(旧版本的构建系统被 F2003 形式的 use 语句与双冒号混淆,此外还可以混淆 USE 语句,以便构建系统无法识别它们)但这些方面非常模糊。

    对于 Visual Studio 中的多个 Fortran 项目,可能需要修改依赖项目的模块搜索目录,以便他们可以在项目依赖树中找到以前项目编译的 mod 文件。如果 Visual Studio 中的项目间依赖关系设置正确,英特尔 Fortran 的更高版本也会自动处理此方面。

    【讨论】:

    • 感谢您的出色回答。您让我深入了解了模块在 Visual Studio 环境中的工作方式。多亏了你,我现在有多个模块可以正常工作!非常感谢您抽出宝贵时间写出该解释。
    猜你喜欢
    • 2013-06-27
    • 2012-11-30
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多