8

Fortran 90 モジュールはエバネッセント クリーチャーです。私はしばらくの間、(単一の)モジュールを使用していましたが、ある程度成功しました(Intel Visual FortranとVisual Studio 2010を使用してコンパイルしました)。次に、このエラーを受け取る前に、別のモジュールを作成して別の関数で使用しようとしました。

 error #7002: Error in opening the compiled module file.  Check INCLUDE paths.

そのため、問題のあるモジュールを削除しました。しかし、元のモジュールにアクセスしようとすると、同じエラーが表示されます!

これらの謎の生き物をどのように見つけることができますか? 1 つのモジュールでは機能するのに 2 つのモジュールでは機能しないのはなぜですか? それらを削除して再コンパイルするか、何らかの方法でそれらを含めるようにコンパイラーに指示する必要があると想定しています。ソース コードのファイルの場所は知っていますが、コンパイル先がわかりません。

4

1 に答える 1

29

その特定のプロセッサーの場合 (他の多くの Fortran プロセッサーは同様の特性を持っていますが、詳細は異なります):

  • モジュールが正常にコンパイルされると、コンパイラは、モジュールによって提供されるエンティティに関する情報を含む .mod ファイル (およびおそらく .obj ファイル) を生成します。あなたが引用しているエラーメッセージが参照しているのは、この mod ファイルです。コンパイラは、他のソースのコンパイル中にモジュールの USE ステートメントを検出すると、この mod ファイルを必要とします。(obj ファイルはリンク段階で使用されます。)

  • したがって、モジュールを USE する前に、コンパイラはモジュールのソース コードをコンパイルしておく必要があります。つまり、モジュールのソース コード (MODULE...END MODULE) は、ソース ファイル内で USE ステートメントの前に記述されているか、ソース ファイルの前に USE ステートメントでコンパイルされた別のファイルに含まれている必要があります。

  • Visual Studio 内でインテル Fortran プロジェクトを使用してコンパイルする場合、ビルド環境は、プロジェクト内のソース ファイルの適切なコンパイル順序を自動的に調整しようとします。コマンドラインから ifort コマンドを使用してコンパイルする場合、プログラマはコンパイル順序を管理する責任があります。

  • 生成された mod ファイルを受け取るディレクトリは、コンパイラに指定された最初の /module コマンド ライン オプションによって指定されます。Visual Studio では、このオプションは Fortran > Output Files > Module Path プロパティを使用して設定されます。デフォルトでは、Visual Studio の Fortran プロジェクトでは、このプロパティが現在の構成の名前に設定されているため、mod ファイルは Debug または Release という名前のプロジェクトの子ディレクトリに表示されます。/module コマンド ライン オプションがない場合、mod ファイルは現在のディレクトリに表示されます。

  • /module コマンド ライン オプション (または同等の Visual Studio プロパティ) で指定されたディレクトリは、mod ファイルの検索にも使用されます。さらに、/I コマンド ライン オプション (Visual Studio では、[Fortran] > [全般] > [追加のインクルード ディレクトリ]) で指定されたディレクトリが検索されます。

単一の Visual Studio プロジェクトまたは複数のプロジェクトなどを持っているかどうかなど、ソース ファイル間でモジュールをどのように分散したかについての質問からは明らかではありません。単一のプロジェクトのみを扱っている場合、通常、必要なのはすべての Fortran ファイルをプロジェクトのソース ファイルに追加すると、デフォルト設定が「機能する」はずです。mod ファイルの検索でエラーが発生する原因として、次のことが考えられます。

  • モジュールに関連付けられたソースが、プロジェクトのソース ファイルのいずれにもありません。

  • モジュールのソースのコンパイルが何らかの理由で失敗しました (ビルド シーケンスの前にリストされている他のエラーはありますか?)

  • モジュールは、特定のソース ファイルでの使用後に定義されます。

  • モジュール間に循環依存関係があります (モジュール A は A または類似のものを使用するモジュール B を使用します - これは言語の規則によって許可されていません)。

  • ビルド順序の自動決定を混乱させるいくつかのソース コンストラクト (ビルド システムの古いバージョンは、F2003 形式の use ステートメントと二重コロンで混乱していました。さらに、ビルド システムがそれらを識別できないように USE ステートメントを難読化することが可能です)しかし、これらの側面はかなりあいまいです。

Visual Studio の複数の Fortran プロジェクトでは、依存プロジェクトのモジュール検索ディレクトリを変更する必要がある場合があります。これにより、プロジェクトの依存関係ツリーで以前のプロジェクトによってコンパイルされた mod ファイルを見つけることができます。Visual Studio のプロジェクト間の依存関係の設定が正しい場合、インテル Fortran の以降のバージョンでは、この側面も自動的に処理されます。

于 2012-09-06T23:59:47.837 に答える