GFortran和CodeBlocks问题与模块和多个文件

时间:2013-07-09 01:21:44

标签: fortran codeblocks fortran90 gfortran

我正在使用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的这个问题。

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

3 个答案:

答案 0 :(得分: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 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个文件进行编译。