调试编译错误的Fortran策略

时间:2015-12-02 01:11:02

标签: 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”中“使用”模块“add”和“subtract”,使例程从“add”和“subtract”公开,然后在“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

我得到的错误(就简化示例而言)是:

\add.o 
\subtract.o 
\subs.o 
\main.o
gfortran: error: main.o: No such file or directory
make: *** [main] Error 1

我的大样例中的错误看起来像

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

很抱歉很长时间的介绍,但这是我的问题:我该如何调试?如果这是一个传达不好的问题,我很抱歉,但我不能在一个简单的情况下重新产生这个错误,所以我不确定如何提出这个问题。任何有关解决方案,调试建议或改进此问题的帮助都非常感谢!

更新:

在看到有关编译错误拼写错误的评论后,我尝试颠倒已使用模块的顺序。也就是说,现在我尝试单独使用“减法”,它工作正常,但然后尝试使用“添加”(一起),我得到相同的错误。我现在开始认为这是编译器错误或其他什么。

更新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>

我将尝试更新的编译器,看看这是否解决了问题

0 个答案:

没有答案