我正在使用GFortran和CodeBlocks,但我遇到了有关模块和多个文件的问题。 我一直收到这个错误:
Fatal Error: Can't open module file 'mesh.mod' for reading at (1): No such file or directory
出于某种原因,GFortran没有构建'mesh.mod'文件。 当我将所有代码放在一个.f90文件中时,不会发生此问题。
Bellow是发生此错误的代码示例。
main.f90时
MODULE MESH
IMPLICIT NONE
INTEGER :: IMAX,JMAX,NMAX
REAL(8), ALLOCATABLE :: XD(:),YD(:),FX(:,:),FY(:,:)
REAL(8) :: PI,E,DX,DY,H,L,RHO,MU
PARAMETER (PI = ACOS(-1.D0))
PARAMETER (E = 2.718)
END MODULE MESH
!**************************************************************
program Cavity
Use Mesh
implicit none
Real(8), Allocatable :: func(:)
Real(8) :: Der,DfDx
integer :: i
IMAX=10
DX=1./10
Allocate(xd(IMAX),func(IMAX))
Do i=1,IMAX
xd(i)=i*DX
End Do
Do i=1,IMAX
func(i) = xd(i)**2
End Do
Der=Dfdx(func,2)
Write(*,*) Der
End program Cavity
Derivatives.f90
Real(8) Function DfDx(f,i)
Use Mesh
implicit none
Real(8) :: f(1:Imax)
integer :: i
DfDx=(f(i+1)-f(i-1))/(2d0*dx)
return
end function DfDx
当我使用控制台命令行编译而不是CodeBlocks接口时,我已经解决了这个问题(Compiling Multiple Files with modules),但我仍然遇到CodeBlocks的这个问题。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
假设你所编写的代码是你的代码,那么问题是module mesh
是在主程序中而不是单独的文件。您应该有三个文件:Mesh.f90
,Derivatives.f90
和Main.f90
。
Mesh.f90就像你拥有它一样,
module Mesh
implicit none
integer :: IMAX,JMAX,NMAX
real(8), allocatable :: XD(:),YD(:),FX(:,:),FY(:,:)
real(8) :: PI,E,DX,DY,H,L,RHO,MU
parameter (PI = ACOS(-1.D0))
parameter (E = 2.718)
end module Mesh
Derivatives.f90应该使用contains
编写为另一个模块:
module Derivatives
use mesh
contains
real(8) function dfdx(f,i)
real(8) :: f(i:imax)
integer :: i
DfDx=(f(i+1)-f(i-1))/(2d0*dx)
end function dfdx
end module Derivatives
然后Main.f90将use
两个模块。请注意,我必须删除变量DfDx
;这是因为它与function DfDx
module Derivatives
冲突
program Cavity
Use Mesh
use Derivatives
implicit none
Real(8), Allocatable :: func(:)
Real(8) :: Der
integer :: i
IMAX=10
DX=1./10
Allocate(xd(IMAX),func(IMAX))
Do i=1,IMAX
xd(i)=i*DX
End Do
Do i=1,IMAX
func(i) = xd(i)**2
End Do
Der=Dfdx(func,2)
Write(*,*) Der
End program Cavity
我不知道CodeBlocks是如何工作的,但我认为它可以让你选择编译顺序。如果是这种情况,你应首先编译Mesh.f90,然后编译Derivatives.f90,然后在将它们链接到可执行文件之前编译Main.f90。
当我编辑&联系他们,我得到了0.200000002980232的答案;希望这也能与你拥有的东西联系起来。
答案 1 :(得分:1)
在codeblock上,您可以转到项目属性>建立目标 然后选择要首先构建的文件(例如mod.f90)。 在"选定的文件属性"去" Build" 在这里,更改优先级权重。较低的重量意味着将首先构建文件。
答案 2 :(得分:0)
问题是在CodeBlocks中“项目按照外观顺序构建,从上到下”(CodeBlocks Wiki),换句话说,文件按字母顺序编译。 这意味着在我的情况下,Derivatives.f90之前正在编译而不是Main.f90导致错误。
解决问题的一种方法是将仅 Main.f90
文件设置为CodeBlocks中的构建目标:
Project/Properties...
Build Target Files
的{{1}} {}}中选中 Build targets
使用Main.f90
代码中的Include 'File_Name.f90'
命令,以正确的顺序包含其他Main.f90
个文件进行编译。