Compilation 调试编译错误的Fortran策略

Compilation 调试编译错误的Fortran策略,compilation,compiler-errors,fortran,compiler-warnings,gfortran,Compilation,Compiler Errors,Fortran,Compiler Warnings,Gfortran,我很难调试gfortran中的编译错误。我的编译器是: gfortran -v Thread model: posix gcc version 4.9.2 (x86_64-posix-seh-rev4, Built by MinGW-W64 project) 我不能把真正的问题包括在内,因为它太大了。下面我将讨论正在发生的一个模型问题: 我有一个大模块,我们称之为ops,我想把它分解成几个模块(例如加、减、乘、除等)。为此,我在模块“ops”中“使用”模块“add”和“subtract”

我很难调试gfortran中的编译错误。我的编译器是:

 gfortran -v
 Thread model: posix
 gcc version 4.9.2 (x86_64-posix-seh-rev4, Built by MinGW-W64 project)
我不能把真正的问题包括在内,因为它太大了。下面我将讨论正在发生的一个模型问题:

我有一个大模块,我们称之为ops,我想把它分解成几个模块(例如加、减、乘、除等)。为此,我在模块“ops”中“使用”模块“add”和“subtract”,使“add”和“subtract”中的例程公开,然后从只使用“ops”的主程序中调用“add”和“subtract”中的例程

在这个简单的示例中(在下面的一个简单程序中进行了说明),使用这两个模块可以很好地工作,并且没有错误。但是,当我用我的大程序执行此操作时,我在尝试使用“减法”模块时出错(我还将我的意思包括在程序注释中)

以下是该场景的示例:

  module add_mod
  private
  public :: add
  interface add;     module procedure add1;    end interface
  contains
  subroutine add1(a,b,c)
    integer,intent(inout) :: a
    integer,intent(in) :: b,c
    a = b + c
  end subroutine
  end module

  module subtract_mod
  private
  public :: subtract
  interface subtract;     module procedure subtract1;    end interface
  contains
  subroutine subtract1(a,b,c)
    integer,intent(inout) :: a
    integer,intent(in) :: b,c
    a = b - c
  end subroutine
  end module

  module ops
  use add_mod
  ! use subtract_mod ! Removing comment causes error...
  private
  public :: init
  public :: add
  ! public :: subtract ! Removing comment causes error...
  contains 
  subroutine init(a,b,c)
    implicit none
    integer,intent(inout) :: a,b,c
    a = 0; b = 0; c = 0
  end subroutine
end module

program test
  use ops
  implicit none
  integer :: a,b,c
  b = 1; c = 1
  call add(a,b,c)
  write(*,*) 'a,b,c = ',a,b,c
  ! call subtract(a,b,c) ! want to call...
  write(*,*) 'a,b,c = ',a,b,c
end program
我得到的错误(根据简化示例)是:

我的大示例中的错误如下所示

C:\\Users\\charl\\Documents\\obj\parametricStudy.o
gfortran: error: C:\\Users\\charl\\Documnts\\obj\parametricStudy.o: No such file or directory
make: *** [C:\\Users\\charl\\Documents\\MOONS] Error 1
其中,“parametricStudy”是主程序,“MOONS”是目标/可执行文件的名称

就查找可执行文件而言,这看起来并不是一个错误,它看起来是因为其他问题而没有生成可执行文件,但我没有足够的信息来找出原因。我已尝试包含我能想到的所有调试标志:

fimplicit-none -Wuninitialized -cpp -fopenmp -Wall -Wextra -fbacktrace -fcheck=all -O0 -Og
很抱歉这么长时间的介绍,但我的问题是:如何调试它?如果这是一个表达不好的问题,我很抱歉,但是我不能在一个简单的案例中重新产生这个错误,所以我不确定如何提出这个问题。非常感谢您对解决方案、调试建议或改进此问题的任何帮助

更新:

在看到关于编译错误输入的注释后,我尝试颠倒所用模块的顺序。也就是说,现在我试着单独使用“减法”(subtract),效果很好,但是试着使用“加法”(add)(合在一起),我得到了相同的错误。我现在开始认为这是一个编译器错误或什么的

更新2:

我把代码上传到github。可在以下网址下载:

 https://github.com/charliekawczynski/MOONS
makefile在目录中

 \MOONS\makefiles\MOONS
输出应该显示在out_dir中。要编译它,必须定义$TARGET_DIR$和$SRC_DIR$。请注意,现在它是用变量$USER$定义的

更改目录后,我看到一个不同的拼写错误(当我在代码中做一些小更改时,例如删除一些与未使用的变量相关的警告时,这个错误似乎会发生变化)

更新3:

我已经删除了更多与未使用的例程和变量相关的警告,现在我看到错误仍然存在,但是(据我所知)没有输入错误。以下是新的输出:

gfortran -o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\MOONS -J"
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\mod" -fimplicit-none -Wuninitialized -cpp -D_DOUBLE_PRECISION_ -D_FFT_RADIX2_ -fopenmp -Wall -Wextra -fbacktrace -fcheck=all -O0 -Og -D_DEBUG_DEL_ -D_DEBUG_INTERP_ -D_DEBUG_APPLYBCS_ 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\IO_tools.o 
...
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\init_Ufield.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\init_Pfield.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\energySolver.o 
...
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\MOONS.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\richardsonExtrapolation.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\convergenceRate.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\parametricStudy.o
gfortran: error: C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\init_Pfield.: No such file or directory
make: *** [C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\MOONS] Error 1

C:\Users\charl\Documents\GitHub\MOONS\makefiles\MOONS>

我将尝试一个更新的编译器,看看这是否解决了gfortran 5.2无法重现的问题。你能试试更新版本的gfortran吗?(是的,我取消了所有涉及减法内容的行的注释)在您的大示例的错误消息中报告的路径中,
文档
的拼写是错误的。这样的拼写错误可以解释你的问题。@casey,不幸的是,我不能重现一个不起作用的小例子。我想我可以试试更新版本的gfortran,看看问题是否仍然存在。谢谢你的建议@查理在我的第一条评论之后看到了评论。您的makefile中的路径可能有一个输入错误。首先检查一下。我很难相信这个问题与makefile中的输入错误有关,我不知道!在这里发表评论的其他人似乎也没有。不能用gfortran 5.2复制。你能试试更新版本的gfortran吗?(是的,我取消了所有涉及减法内容的行的注释)在您的大示例的错误消息中报告的路径中,
文档
的拼写是错误的。这样的拼写错误可以解释你的问题。@casey,不幸的是,我不能重现一个不起作用的小例子。我想我可以试试更新版本的gfortran,看看问题是否仍然存在。谢谢你的建议@查理在我的第一条评论之后看到了评论。您的makefile中的路径可能有一个输入错误。首先检查一下。我很难相信这个问题与makefile中的输入错误有关,我不知道!在这里发表评论的其他人似乎也不这么认为。
gfortran -o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\MOONS -J"
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\mod" -fimplicit-none -Wuninitialized -cpp -D_DOUBLE_PRECISION_ -D_FFT_RADIX2_ -fopenmp -Wall -Wextra -fbacktrace -fcheck=all -O0 -Og -D_DEBUG_DEL_ -D_DEBUG_INTERP_ -D_DEBUG_APPLYBCS_ 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\IO_tools.o 
...
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\init_Ufield.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\init_Pfield.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\energySolver.o 
...
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\MOONS.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\richardsonExtrapolation.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\convergenceRate.o 
C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\parametricStudy.o
gfortran: error: C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\obj\init_Pfield.: No such file or directory
make: *** [C:\\Users\\charl\\Documents\\GitHub\\MOONS\\out_dir\\MOONS] Error 1

C:\Users\charl\Documents\GitHub\MOONS\makefiles\MOONS>