Makefile プロジェクト内の無数のソース ファイルを編集します。これらのファイルは、タイプ、関数、モジュールに応じて複数のディレクトリに配置されており、どのファイルを最初にコンパイルする必要があるかを指定する一連のルールと、さらに複雑な関数操作を定義します。 Makefile はシェル スクリプトのようなもので、オペレーティング システムのコマンドも実行できます。
完成するMakefileには、プロジェクト全体のコンパイル、接続、その他のルールが記述されます。これらには、プロジェクト内のどのソース ファイルをコンパイルする必要があるか、およびそのコンパイル方法、どのライブラリ ファイルを作成する必要があるか、およびこれらのライブラリ ファイルを作成する方法、および最終的に必要な実行可能ファイルを生成する方法が含まれます。複雑な問題のように思えるかもしれませんが、プロジェクト用に Makefile を作成する利点は、1 つ (通常はプロジェクトに複数) の正しい Makefile が提供されると、1 行のコマンドを使用して「自動コンパイル」を完了できることです。プロジェクト全体をコンパイルするために必要な唯一のことは、シェル プロンプトで make コマンドを入力することです。プロジェクト全体が完全に自動的にコンパイルされるため、効率が大幅に向上します。
make は、Makefile 内の命令 (ルールとも言うべき) を解釈するコマンド ツールです。 Makefile には、プロジェクト全体のすべてのファイルのコンパイル順序とコンパイル ルールが記述されます。 Makefile には独自の記述形式、キーワード、関数があります。 C 言語と同じように、独自の形式、キーワード、関数があります。また、Makefile では、システム シェルによって提供される任意のコマンドを使用して、目的の作業を完了できます。 Makefile (他のシステムでは別のファイル名である場合があります) は、ほとんどの IDE 開発環境で使用されており、プロジェクトのコンパイル方法となっています。
makefile の利点は、「自動コンパイル」です。一度作成すると、必要な make コマンドは 1 つだけで、プロジェクト全体が完全に自動的にコンパイルされるため、ソフトウェア開発の効率が大幅に向上します。 make は、makefile 内の命令を解釈するコマンド ツールです。一般的に、Delphi の make、Visual C++ の nmake、Linux 上の GNU の make など、ほとんどの IDE にこのコマンドがあります。 Makefile がエンジニアリングにおけるコンパイル方法になっていることがわかります。
Make ツールの最も重要かつ基本的な機能は、Makefile ファイルを通じてソース プログラム間の関係を記述し、コンパイル作業を自動的に維持することです。 Makefile ファイルは、特定の構文に従って記述する必要があり、各ソース ファイルをコンパイルし、それを接続して実行可能ファイルを生成する方法を説明する必要があり、ソース ファイル間の依存関係を定義する必要があります。 Makefile ファイルは、Windows NT のコンパイラを含む多くのコンパイラで、統合開発環境でコンパイル情報を維持するための一般的な方法です。ユーザーは使いやすいインターフェイスを通じてのみ Makefile ファイルを変更します。 UNIX システムでは、通常、Makefile ファイルとして Makefile を使用します。他のファイルをメイクファイルとして使用したい場合は、次のような make コマンド オプションを使用してメイクファイル ファイルを指定できます:
$ make -f Makefile.debug _たとえば、prog という名前のプログラムは 3 つの C ソース ファイル filea で構成されます。 .c、fileb .c、および filec.c とライブラリ ファイル LS がコンパイルされ、生成されます。これら 3 つのファイルには、それぞれ独自のヘッダー ファイル a.h、b.h、および c.h も含まれています。通常、C コンパイラは 3 つのオブジェクト ファイル filea.o、fileb.o、および filec.o を出力します。 filea.c と fileb.c はどちらも defs という名前のファイルの使用を宣言しているが、filec.c は宣言していないとします。つまり、filea.c と fileb.c に次のようなステートメントがあります:
include "defs"
そして、次のドキュメントはこれらのファイル間の相互接続について説明しています:
0 #makefile コメント行の記述例です
1 prog: filea.o fileb.o filec.o #3つのターゲットファイルfilea.o、fileb.o、filec.oをリンクして生成するprogを指定
2 cc filea.o fileb.o filec.o -LS -o prog #prog が依存するファイルから実行可能ファイルを作成する方法
3 filea.o : filea.c a.h defs #filea.o ターゲット ファイル、.c および .h ファイルとその defs を指定しますdepend on File
4 cc -c filea.c #ターゲットが依存するファイルからターゲットを作成する方法、つまり filea.c から filea.o を作成する方法
5 fileb.o : fileb.c b.h defs # fileb.o ターゲット ファイル、およびそれらが依存する .c および .h ファイルと defs ファイルを指定します
6 cc -c fileb.c #ターゲットが依存するファイルからターゲットを構築する方法、つまり、fileb.c から fileb.o を構築する方法
7 filec. o : filec.c c.h #filec.o ターゲット ファイルと、それらが依存する .c および .h ファイルを指定します
8 cc -c filec.c #ターゲットが依存するファイルからターゲットを作成する方法、つまり filec からターゲットを作成する方法。
この説明ドキュメントは、深さ優先の原則を使用してコンパイル コマンドを実行する単純な Makefile です。上記の例のコードについて、いくつかの基本的な説明をします。 CC は、Makefile で使用されるコンパイラを指定するグローバル変数です。通常、デフォルトは gcc で、Unix では中間コード ターゲット ファイルです。 Windows の場合 Unix の .obj ファイルと同様、Unix で .o ファイルを生成するプロセスはコンパイルと呼ばれ、無数の .o ファイルを収集して実行可能ファイルを生成するプロセスはリンクと呼ばれます。 Unix インターフェイス ファイル、つまり、Windows のライブラリ ファイルに相当する .a ファイルの機能は次のとおりです。ソース ファイルが多すぎるためです (上記の例では、多すぎる .c ファイルと .h ファイルを参照しています)。 )、コンパイルによって生成される中間ターゲット ファイル (.o ファイルが多すぎます)、リンク時に中間ターゲット ファイルの名前を明確に指定する必要があるため、コンパイル時に非常に不便です。中間ターゲット ファイルであり、このパッケージは .a ファイルです。
コンパイル後に filea.c または a.h ファイルが変更されると、make ツールは自動的に filea.o を再コンパイルできます (2 つのコンパイルの間に filea.c も a.h も変更されていない場合)、および filea.o がまだ存在する場合は、再コンパイルする必要はありません。この依存関係は、複数のソース ファイルを使用してプログラムをコンパイルする場合に特に重要です。この依存関係を定義することにより、make ツールは多くの不必要なコンパイル作業を回避できます。もちろん、シェル スクリプトを使用して自動コンパイル効果を実現することもできます。ただし、シェル スクリプトは再コンパイルする必要のないソース ファイルを含むすべてのソース ファイルをコンパイルしますが、make ツールはターゲットが最後に実行された時刻に基づいてコンパイルできます。ソース ファイルの更新時間に基づいて、どのソース ファイルをコンパイルする必要があるかを自動的に決定します。 _
まず Makefile のルールを大まかに見てみましょう。 [3] ターゲット ... : 前提条件 ... コマンド ... ... ターゲット: 依存関係実行コマンド ... target はターゲット ファイルであり、オブジェクト ファイルまたは実行ファイルにすることができます。ラベルにもなります。 ① 前提条件は、そのターゲットを生成するために必要なファイルまたはターゲットです。 ②コマンドはmakeが実行する必要があるコマンドです。 (任意のシェル コマンド) これはファイル依存関係です。つまり、ターゲットの 1 つ以上のターゲット ファイルが前提条件内のファイルに依存し、その生成ルールがコマンドで定義されます。率直に言うと、前提条件にターゲット ファイルよりも新しいファイルが複数ある場合、command で定義されたコマンドが実行されます (コマンドは Tab キーで始まる必要があります。そうしないとコンパイラはコマンドを認識しません)。コンパイルを繰り返すことで、ソフトウェアエンジニアリングの管理効率が向上しました。
Makefile を使用すると、単純なマクロを使用してソース ファイルとその関連コンパイル情報を参照できます。マクロは Linux では変数とも呼ばれます。マクロを引用する場合は、変数の前に $ 記号を追加するだけで済みますが、変数名が 1 文字より長い場合は引用時に括弧 () を追加する必要があることに注意してください。 有効なマクロ参照は $(CFLAGS) $Z $(Z) で、最後の 2 つの参照は同一です。 Unix システムでは、4 つの特殊マクロ $*、$@、$ および $ の値がコマンドの実行中に変更されることに注意してください。変数は で定義されます。事前定義された変数の詳細に関しては、マクロ定義を使用すると、面倒なコンパイル オプションから解放され、メイクファイルの作成に非常に便利になります。
GNU make の主な定義済み変数 定義済み変数 意味 $* 拡張子を除いた対象ファイルの名前。 $+ 出現順にスペースで区切られたすべての依存ファイルには、重複した依存ファイルが含まれる場合があります。 $< 最初の依存ファイルの名前。 $? 変更日がターゲットの作成日より後の、スペースで区切られたすべての依存ファイル。 $@ ターゲットのフルネーム。 $^ スペースで区切られたすべての依存ファイルには、重複した依存ファイルは含まれません。 $% ターゲットがアーカイブ メンバーの場合、この変数はターゲットのアーカイブ メンバー名を表します。たとえば、ターゲット名が (image.o) の場合、$@ は、$% は image.o です。 AR アーカイブ保守プログラムの名前。デフォルト値は ar です。 ARFLAGS アーカイブ保守プログラムのオプション。 AS アセンブラの名前。デフォルトは as です。 ASFLAGS アセンブラ オプション。 CC C コンパイラの名前。デフォルトは cc です。 CFLAGS C コンパイラ オプション。 CPP C プリコンパイラの名前。デフォルト値は $(CC) -E です。 CPPFLAGS C プリコンパイル オプション。 CXX C++ コンパイラ名、デフォルトは g++ です。 CXXFLAGS C++ コンパイラ オプション。 FC FORTRAN コンパイラの名前。デフォルト値は f77 です。 FFLAGS FORTRAN コンパイラ オプション。 Makefile は、コロンの右側のファイルをファイル名:ファイル名の形式で比較し、左側のファイルよりも新しいかどうかを確認し、更新されている場合は、プログラム コードの次の行が実行されます。したがって、Makefile はファイルを関連付けることができます