2013-07-09 30 views
0

我正在與GFortran和CodeBlocks,但我有關於模塊和多個文件的問題。 我不斷收到此錯誤:GFortran和CodeBlocks問題與模塊和多個文件

Fatal Error: Can't open module file 'mesh.mod' for reading at (1): No such file or directory 

出於某種原因,GFortran不建設「mesh.mod」文件。 當我將所有代碼放在一個.f90文件中時,不會發生此問題。

貝婁是這種錯誤發生的代碼的一個例子。

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 

當我使用的,而不是代碼塊接口控制檯命令行編譯我已經解決了這個問題(Compiling Multiple Files with modules),但我仍然得到這個CodeBlocks的問題。

有誰知道如何解決這個問題?

+0

我從來沒有使用CodeBlocks,但我認爲這個問題是編譯不按順序的東西。你試圖編譯單獨文件的順序是什麼? – tpg2114

+0

此外,不要聽起來不禮貌,但SO不喜歡問題中的感謝/簽名/問候,也不喜歡標題中的標籤(本例中爲[tag:fortran90])。我編輯了你的其他問題,並在這裏做同樣的工作 – tpg2114

+0

好的...對不起,我不知道這件事。我認爲你是對的,這可能是由於編譯順序,但我在CodeBlocks中找不到任何關於此的選項。實際上,我並不知道CodeBlocks在編譯時如何使用f90文件。我希望有人能向我解釋。 – Eleteroboltz

回答

0

問題是在CodeBlocks中「項目是按照出現順序,從上到下」(CodeBlocks Wiki)構建的,換句話說,這些文件是按字母順序編譯的。 這意味着在我的情況下,Derivatives.f90正在編譯之前比Main.f90導致錯誤。

到這個問題的一個方法是設置Main.f90文件作爲構建目標的代碼塊:在標籤Build targets檢查

  • 菜單Project/Properties...
  • Build Target Files只有Main.f90

並使用命令Include 'File_Name.f90'裏面的Main.f90代碼以包含其他f90文件以正確的順序編譯。

+0

[Code :: Blocks手冊](http://www.codeblocks.org/docs/manual_en.pdf)的第1.11.14節說您可以更改鏈接順序,第1.8節說您可以使用「Project」 - >'Properties' - >'Projects dependencies'來設置'Derivatives.f90'取決於'Mesh.f90'。 –

1

假設你寫的是你的代碼,那麼看起來問題是module mesh在主程序中,而不是一個單獨的文件。您應該有三個文件:Mesh.f90,Derivatives.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 DfDxmodule 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 

我不知道代碼塊是如何工作的衝突,但我會假設它可以讓你選擇編譯順序。如果是這樣的話,你應該首先編譯Mesh.f90,然後編譯Derivatives.f90,然後編譯Main.f90,然後將它們鏈接到可執行文件。

當我編譯&鏈接它們時,我得到了0.200000002980232的答案;希望能夠和你擁有的東西聯繫起來。

1

在代碼塊上,您可以轉到項目屬性>構建目標 然後選擇您想要構建的文件(比如mod.f90)。 在「選定的文件屬性」中,轉到「Build」 在這裏,更改優先權重。較低的重量意味着該文件將首先構建。