1

我正在使用 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

衍生品.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 界面时,我已经解决了这个问题(使用模块编译多个文件),但我仍然遇到 CodeBlocks 的这个问题。

有谁知道如何解决这个问题?

4

3 回答 3

1

假设您编写的代码是您的代码,那么问题似乎在于module mesh主程序内部而不是单独的文件。您应该有三个文件Mesh.f90Derivatives.f90Main.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 DfDxin冲突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;希望这也与您所拥有的有关。

于 2013-07-09T13:53:18.153 回答
1

在代码块上,您可以转到项目属性> 构建目标然后选择您要首先构建的文件(例如 mod.f90)。在“选定的文件属性”中转到“构建”这里,更改优先级权重。较低的权重意味着将首先构建文件。

于 2016-01-11T14:06:02.577 回答
0

问题是在 CodeBlocks 中“项目是按照出现的顺序构建的,从上到下”(CodeBlocks Wiki),换句话说,文件是按字母顺序编译的。这意味着在我的情况下,Derivatives.f90 比 Main.f90 更早被编译导致错误。

规避该问题的一种方法是在 CodeBlocks 中将文件设置为构建目标:Main.f90

  • 菜单Project/Properties...
  • Build Target Files选项卡中Build targets检查 Main.f90

并使用代码中的命令Include 'File_Name.f90'以正确的顺序Main.f90包含其他f90文件进行编译。

于 2013-07-09T20:50:40.527 回答