2013-04-18 296 views
5

私は束のモジュールを使用するfortranプログラムをコンパイルしようとしています。私はそれをコンパイルするときにエラーが発生し、それは私を夢中にしています。エラーが1つのサブルーチンの添加によって発信され、私は、プログラムを再コンパイルしようとしたときに行われます。Fortranコンパイルエラー - 定義されていない参照

主なプログラムは以下の2行が含まれます。

-

-

call read_step(nStepOne,molOne) 
call read_step(nStep,mol) 

これはファイル "fileio.f90"内のサブルーチンの1つを呼び出しています:

-

subroutine read_step(n,tape) 

implicit none 

integer, intent(in) :: tape 
integer, intent(out) :: n 

character(len=6) :: dum 

rewind(tape) 
read (tape,*) 
read (tape,*) dum, n 
rewind(tape) 
return 
! 
end subroutine read_step 

-

私はそれをコンパイルしようとすると、次のエラーが発生します。同じモジュール内のサブルーチンへ

ifort -o SpIdMD.x *.o -static-intel -openmp 
SpIdMD.o: In function `MAIN__': 
SpIdMD.f90:(.text+0x3b2): undefined reference to `read_step_' 
SpIdMD.f90:(.text+0x3c5): undefined reference to `read_step_' 
make: *** [SpIdMD.x] Error 1 

その他の呼び出しはすべてのエラーを与えていない、と私はしないでください「古いサブルーチン」への呼び出しと作成した呼び出しの違いを確認してください。

苦情を与えるものではありませんこれらの "古いサブルーチン"、の1の例は、次のとおりです。fileio.f90で

call get_dim(n_atom,nSnap,mol) 

subroutine get_dim(n,n_snap,tape) 

implicit none 

integer,intent(in) :: tape 
integer,intent(out) :: n, n_snap 
integer :: m 

rewind(tape) 
read (tape,*,err=1,end=2) n 
rewind(tape) 

m = 0 
do while (.true.) 
    read (tape,*,err=1,end=3) 
    m = m +1 
end do 
3 n_snap = m/(n + 2) 
if (m.ne.(n_snap*(n + 2))) stop 'unexpected end of input file' 

rewind(tape) 

return 
! 
1 stop 'error in input file' 
2 stop 'unexpected end of input file' 
end subroutine get_dim 
メインプログラムで

私はこの動作がどうしてもわかりません。もし誰かがこの悪夢を解決するのを手伝ってくれたら、私は感謝しています。ありがとう!

+2

'make clean'を実行してから' make'をもう一度試しましたか? –

+0

しかし、何も解決しません。私はfileio.o(モジュールを含む)が更新されたことを確認しました。 – user2296052

答えて

7

サブルーチンread_stepの定義がモジュール内にある場合、そのモジュールのUSE文をメインプログラムの先頭に追加するのを忘れてしまったか、モジュール内の関連プロシージャがPUBLICではありません。そのコンパイラ(およびいくつかの他のもの)で

モジュール手順については、リンカーの名前は、一般的に先頭と末尾の様々な量のプロシージャ名に続く「MP」は(場合は変化してもよい)、塩漬けを強調し、続いてモジュール名から構成され味わう。リンカーエラーには、プロシージャー参照でスコープをコンパイルするときに、プロシージャーがモジュールプロシージャーであるとは見なされないことを示す、その "mangling"がありません。

+0

ありがとうIanHたくさん!あなたは私の問題を解決しました。モジュールの上部にある「パブリック」タグに関連するサブルーチンの名前を追加していないというあなたのコメントに感謝します。 – user2296052

0

もっと具体的には、他の回答に記載されているUSEとPUBLICステートメントの使い方を示します。

私はこのように私のF77の機能をラップ:古いコード(1986)大文字で、私のコードは下部ケースですが

module mod 
    contains 
    FUNCTION FUNC(PARAM) 
    ... 
    END 
    end module mod 

。 これはうまくコンパイルされます。 moduleとの間にpublic funcを追加することができます。しかし、これはデフォルトのようですので、あなたはそれを必要としません。

リンクするときは、プログラムとライブラリを次のように渡す必要があります:gfortran -o prog prog.for mod.for(または前にコンパイルした場合は.o)。

+0

これはおそらく質問ではなく、答えであるべきです。モジュールを使用してソースをコンパイルすると、オブジェクトファイル(.o)が生成されます。このオブジェクトファイルを後のリンクステップに提供していますか? – IanH

+0

私は知っている、私は質問を投稿した:http://stackoverflow.com/questions/32278178/how-to-call-a-function-in-fortran-that-is-defined-in-a-separate-file/32278579 #32278579これを削除するか、実際の答えに更新します。 ;) – JPT

関連する問題