5

同じモジュール内の別の関数を呼び出す関数/サブルーチンをモジュールに書き込もうとしていますが、リンカー エラーが発生します。同じ動作を示すおもちゃの例:

!in test.f

module m1
  implicit none
contains
  real function mult(a, b)
    real :: a
    real :: b
    mult = a * b
    return
  end function mult

  real function sq(a)
    real :: a, mult
    sq = mult(a, a)
    return
  end function sq

end module m1

program main
use m1
write(*,*) sq(2.0)
end program

これをコンパイルしようとすると、問題が発生します。

[christopher@archlinux metropolis]$ gfortran -ffree-form test.f
/tmp/ccpzdTLE.o: In function `__m1_MOD_sq':
test.f:(.text+0x20): undefined reference to `mult_'
collect2: error: ld returned 1 exit status

一方、 ( gfortran -c -ffree-form test.f -Wall) だけをコンパイルすると問題なく実行されます。

今、これはコンパイラエラーのように世界中を探します---モジュールでは、mult_実際に対処すべきときへの参照が表示されます__m1_MOD_sq---しかし、これがコンパイラのバグであるとは信じがたいです私が愚かなことをするよりも。

DDG は有用なものを見つけませんでした。同様の問題のほとんどは、1 つのメイン ファイルからモジュールを分割する際に発生しました。そのような場合、モジュールが と同じファイルにprogramあるとうまくいきましたが、ここではそうではありません。Fortran のモジュールに関する多くのページを見ましたが、関連するものは何もありませんでした。

誰かが適切なドキュメントを教えてくれますか、それとも何が起こっているのか、どうすれば修正できるかを説明してくれますか?

4

1 に答える 1

5

関数sqで関数multを宣言する必要はありません。つまり、「real::mult」は必要ありません。sqは同じモジュール内にあるため、すでにmultについて「認識」しています。multのインターフェースは、同じモジュール内にあるため、sqに知られています。multとsqのインターフェースは、モジュールを使用するため、メインプログラムに認識されています。インターフェイスを提供するモジュールと宣言の両方があると、コンパイラが混乱します。

于 2012-07-16T21:57:32.390 に答える