Fortran 90模块的神秘本质

时间:2012-09-06 19:06:36

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

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

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

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

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

1 个答案:

答案 0 :(得分:28)

对于那个特定的处理器(许多其他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> General>其他包含目录)中指定的目录。

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

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

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

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

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

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

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