我很难在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>
我将尝试更新的编译器,看看这是否解决了问题