Fortran 90模块的神秘本质

fro*_*yte 8 fortran visual-studio-2010 fortran90 fortran95 intel-fortran

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

 error #7002: Error in opening the compiled module file.  Check INCLUDE paths.
Run Code Online (Sandbox Code Playgroud)

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

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

Ian*_*anH 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>常规>其他包含目录中)指定的目录.

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

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

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

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

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

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

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

  • +1对一个非常模糊的问题的优秀和详细的答案. (4认同)