Fortran 90模块是渐逝的生物。我使用(奇异)模块一段时间取得了一些成功(使用英特尔Visual Fortran和Visual Studio 2010进行编译)。然后我写了另一个模块并尝试在另一个函数中使用它,然后才收到此错误:
error #7002: Error in opening the compiled module file. Check INCLUDE paths.
所以我删除了有问题的模块。但是现在我在尝试访问原始模块后收到了同样的错误!
我如何找到这些神秘的生物?为什么一个模块工作但不是两个?我假设我需要删除并重新编译它们,或者告诉编译器以某种方式包含它们。我知道源代码的文件位置,但不知道编译到的。
答案 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的更高版本也会自动处理此方面。