インクルードファイルとモジュール#

プログラムは、同じディレクトリに格納されたり、便利なディレクトリツリーに整理されたりする、さまざまなソースファイルに含めることができます。構成の詳細は、個人の好み、所属する開発者グループによる取り決め、または単にプログラムの履歴によって異なります。ディレクトリ構造がどうであれ、特定のソースファイルをコンパイルするためにコンパイラの補助が必要になる状況が発生します。

  • Fortran(およびその他の言語)には、外部ファイルを含める機能があります。この機能は、モジュールの登場により少し有用性が低下しましたが、それでも用途はあります。このような「インクルードファイル」は、いくつかの場所で使用されるため、ソースファイルを含むディレクトリとは別のディレクトリに保存されることがよくあります。多くの場合、そのディレクトリの名前は「include」です。

  • これまで見てきたように、1つ以上のモジュールを定義するソースコードをコンパイルすると、コンパイラはいわゆる「モジュール中間ファイル」(拡張子「.mod」)を生成します。コンパイラは、これらのファイルにアクセスして、インターフェイスや変数などを読み取り、この情報に基づいて、さまざまなモジュールを使用するソースコードを実際にコンパイルする必要があります。

コンパイラは、これらのインクルードファイルとモジュール中間ファイルがどこにあるかを示すために、-Iのようなオプションをサポートしています。 tabulateプログラムの2つのファイルを次のディレクトリ構造に保存するとします。

tabulate/
    main/
        tabulate.f90
    sub/
        functions.f90

コマンドを使用してファイル「functions.f90」をコンパイルすると

$ cd sub
$ gfortran -c functions.f90

次の構造になります

tabulate/
    main/
        tabulate.f90
    sub/
        functions.f90
        user_functions.mod
        functions.o

プログラムを正常にコンパイルしてビルドするには、コンパイラにファイル「user_functions.mod」の場所を伝える必要があります

$ cd main
$ gfortran -c tabulate.f90 -I ../sub
$ gfortran -o tabulate tabulate.o ../sub/functions.o

結果

tabulate/
    main/
        tabulate.f90
        tabulate.o
        tabulate (or tabulate.exe on Windows)
    sub/
        functions.f90
        functions.o
        user_functions.mod

ノート

  • 詳細はコンパイラによって異なります。 -Iオプションの後にスペースとディレクトリ名が続く場合もあれば、ディレクトリが連続して続く場合もあります。

  • デフォルトでは、モジュール中間ファイル(.mod)は、オブジェクトファイルと同じディレクトリに配置されます。プログラムコードが異なるサブディレクトリに整理されている場合、それらはディレクトリツリー全体に散らばり、コンパイルプロセスが複雑になります。幸いなことに、多くのコンパイラでは、これらのファイルの出力場所を指定できます。gfortranの場合、これは-Jです。たとえば、-J../include(.modファイルがすべて同じディレクトリに表示されるように)

  • 多くのソースファイルで構成される大規模なプログラムの場合、使用する構成を検討することが重要です。