-1

私はFortranを初めて使用するので、これは簡単な質問かもしれませんが、SOに関する同様の投稿を調べても機能する解決策は見つかりませんでした。

私の問題は、srft.f95で定義されたモジュールsrftModuleを使用するtestsrft.f95でメインプログラムをコンパイルしようとすると、

  1. gfortran -c dfft.f
  2. gfortran -c srft.f95
  3. gfortran -c testsrft.f95
  4. gfortran dfft.o srft.o testsrft.o -o testsrft

(srftModuleのサブルーチンにはdfft.fのFortran77コードが必要です)、リンカーエラーが発生します

testsrftF.o: In function `MAIN__':
testsrftF.f95:(.text+0x98): undefined reference to `fftofmat_'
collect2: ld returned 1 exit status

モジュールは次のように定義されています

module srftModule
   implicit none
   contains
   ... (some subroutines)

   subroutine fftofmat(A)
     implicit none
     real*8, dimension(:, :), intent(inout) :: A
     ...
   end subroutine fftofmat

   ... (some more subroutines)

end module srftModule

そして私のメインファイルには、

program testsrft
   use srftModule
   implicit none

   ...(code to initialize a 10x10 matrix A)
   call fftofmat(A)

 end program testsrft

リンカが文句を言うのはなぜですか?

4

1 に答える 1

2

いくつかの背景:

  • MAIN__は、gfortranがメインプログラムに使用するシンボルです。
  • 通常、コンパイラは、モジュールプロシージャのシンボル名をマングルして、ホストモジュールの名前を含めます。gfortranの場合、シンボルは__ modulename_MOD_procedurenameのようになります

未定義の参照エラーで引用されたシンボルは、モジュールプロシージャ参照のシンボルのパターンと一致しません。つまり、メインプログラムでは、コンパイラはfftofmatがモジュールプロシージャであるとは見なさないということです。これは、解決する必要のある問題です。これはあなたが示すコードとは反対なので、私が探しているものは...

  • あなたが実際に使用しているコードを示しているコードですか(入力したと思う/関連があると思うコードに対して)-そのuseステートメントがあり、モジュールプロシージャ名が正しくスペルされており、モジュールにプライベートステートメントがありません、メインプログラムの参照は、ホストに関連付けられた名前が何らかの理由で非表示になっている内部プロシージャにありませんか?
  • ソースファイルはすべてエラーなしでコンパイルされていますか?現在のコンパイルからのmodファイルよりも優先して取得される可能性のある、以前に成功したコンパイルからの「残りの」modファイルはありますか?

これが問題の原因ではないと思いますが、一部のシステムはリンクステップでのオブジェクトファイルとライブラリの順序に敏感であることに注意してください(さらにそうです)-参照するファイルに続くファイルでシンボルが検索されますコマンドライン上の特定の記号。堅牢にするには、オブジェクトファイルを逆に注文する必要があります。

于 2012-09-27T00:30:07.010 に答える