8

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

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

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

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

4

1 回答 1

29

对于该特定处理器(许多其他 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 项目还是多个项目等。如果您只处理一个项目,那么通常所需要做的就是将所有 Fortran 文件添加到项目的源文件中,默认设置应该“有效”。查找 mod 文件时出错可能是因为:

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

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

  • 模块在特定源文件中使用后定义;

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

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

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

于 2012-09-06T23:59:47.837 回答