makefileとは
Makefile:Makefileは、Linuxでのソースファイルの自動コンパイルツールです。プロジェクト内のソースファイルはカウントされません。タイプ、機能、モジュールに応じていくつかのディレクトリに配置されます。Makefileは、どのファイルを指定するかを指定する一連のルールを定義します。最初にコンパイルする必要がある、後でコンパイルする必要があるファイル、再コンパイルする必要があるファイル、またはさらに複雑な機能操作Makefileは、オペレーティングシステムコマンドも実行できるシェルスクリプトのようなものです。
make:makeは、makefile内の命令を解釈するコマンドツールです。makefileの利点は「自動コンパイル」です。一度作成すると、必要なmakeコマンドは1つだけで、プロジェクト全体が自動的に完全にコンパイルされます。ソフトウェア開発の効率を向上させる
makefile
makeコマンドを実行するときは、プログラムのコンパイルとリンクの方法をmakeコマンドに指示するためにmakefileファイルが必要です。ファイル名は「Makefile」または「makefile」または「GNUmakefile」である必要があります。他の名前を使用する場合は、を使用する必要があります。 「make-fMakeLinux」など、指定するmakeコマンド-fまたは-fileパラメーター
ほとんどのmakeは、「makefile」と「Makefile」のデフォルトのファイル名をサポートしているため、ファイル名として使用するのが最適です。
Makefile書き込みルール:
target:prerequisites
command
ターゲットは、生成されるオブジェクトファイル(オブジェクトファイル)であり、実行可能ファイルまたはラベルにすることもできます。
前提条件は、必要な前提条件のターゲットファイルを生成することです
Commndは、前提条件によってターゲットを生成するために必要なコマンド(Shellコマンド)です。
注:コマンドの前にタブを使用してインデントします
これはファイルの依存関係です。つまり、ターゲットの1つ以上のターゲットファイルは前提条件のファイルに依存し、生成ルールはコマンドで定義されます。
makefileでは、ルールが書き込まれる順序が非常に重要です。makefileには最終目標があり、他のすべての目標はこの目標によってリンクされている必要があります。最終目標を知らせてください。makefileの最初のルールの目標は、最終目標として設定されます。最初のルールに多くの目標がある場合、最初の目標が最終目標になります。makeが達成するのはこの目標です
たとえば、次の図:(メインが最終目標です)
変数を使用する
変数は、コンピュータシステムが変数値を格納するために使用するデータタイプです。対応する変数値は、変数名から直接抽出できます。一部の設定または予約済みデータの文字列を、単語または記号のセットなどに置き換えることです。
変数の使用方法:
- 定義:=を使用して定義します
- 使用:$(変数名)
例:上記の例には5つの.oファイルがあり、次のように定義できます。
file=my_add.o my_sub.o my_mux.o\
my_div.o main.o
バックスラッシュ\は、新行文字の意味です。将来これらの5つの.oファイルを使用するには、$(file)を使用するだけです。
変数と環境変数のその他の紹介については、以前のブログ「Linux:シェル、BASH、シェルスクリプトの紹介」を参照してください。
ドキュメント検索
一部の大規模なプロジェクトでは、多数のソースファイルがあります。通常は、これらの多数のソースファイルを分類して、異なるディレクトリに保存します。したがって、makeがファイルの依存関係を見つける必要がある場合は、ファイルの前にパスを追加できますが、最善の方法は、makeにパスを指示し、makeに自動的に見つけさせることです。
makefileの特別な変数VPATHはこの関数を実装します。この変数が指定されていない場合、makeは現在のディレクトリ内の依存ファイルとターゲットファイルのみを検索します。この変数が定義されている場合、現在のディレクトリが見つからない場合、makeは指定されたディレクトリ内のファイルを検索します
VPATHの使用規則:
VPATH=path1:path2
上記では、コロンで区切られた2つのパスが指定されています。
makeのキーワードvpathを使用して、ファイル検索パスを設定することもできます。Vapthはすべて小文字であり、キーワードでありVPATHが変数であるVPATHとは異なります。
Vpathの使用規則:
vpath <pattern> <directories> #为符合模式<pattern>的文件指定搜索路径<directories>
vpath<pattern> #清除符合模式<pattern>的文件的搜索目录
vpath #清除所有已被设置好了的文件搜索目录
例:vpath%.c path1は、指定された.cファイルの検索ディレクトリがpath1であることを示します。%は、0個または複数の文字が一致することを示します。
あいまいなルール
GNUのmakeは非常に強力で、ファイルとファイルの依存関係の背後にあるコマンドを自動的に派生させることができます。したがって、makeは自動的に認識してそれを単独で使用するため、各.oファイルの後に同様のコマンドを記述する必要はありません。コマンドを導出する
makeが.oファイルを検出する限り、依存関係に.cファイルが自動的に追加されます。makeがwhatever.oを検出すると、whatever.cはwhatever.oの依存ファイルになります。そしてgcc-cwhatever.cも推測されます。これはmakeのあいまいなルールです。
次の図に示すように、あいまいなルールと変数に従って、最初の例を簡略化できます。
他のmakefileを参照する
maikefileファイルでincludeキーワードを使用して、他のmakefileをインクルードすると、インクルードされたファイルは、現在のファイルのインクルードの場所にそのまま配置されます。
構文を含める:
include file1 file2 file3
fileは、現在のオペレーティングシステムシェルのファイル形式にすることも、パスとワイルドカードを含めることも、変数を使用することもできます。
誤ったターゲット
makefile書き込みルールのターゲットは、clearコマンドなどの疑似ターゲットにすることもできます。
clean:
rm *.o
rm * .oコマンドを実行した後、クリーンファイルは生成されません。クリーンは単なるラベルであり、鮮やかに疑似ターゲットと呼ばれます。
.PHONYを使用して、ターゲットが疑似ターゲットであることを明示的に示すことができます
.PHONY:clean
clean:
rm *.o
注:すべてのmakefileは、ファイルを再コンパイルしてクリーンに保つために、オブジェクトファイル(.oおよび実行ファイル)をクリアするコマンドを作成する必要があります。未記述のルールは次のとおりです。「クリーンは常にファイルの最後に配置されます。 "、makeは、makefileに表示される最初のターゲットをデフォルトのターゲットと見なします。デフォルトのターゲットを生成する必要がない限り、その他は実行されません。したがって、make中にcleanは実行されません。cleanコマンドを実行するには、makecleanコマンドを手動で使用して* .oファイルを削除します。
作業実行プロセスを作成する
GNU makeが機能すると、次の手順が実行されます。
- すべてのmakefileを読み込む
- 含まれている他のmakefileを読み込む
- 初期化ファイルの変数
- あいまいなルールを導き出し、すべてのルールを分析します
- すべてのターゲットファイルの関係依存関係チェーンを作成します
- 依存関係に応じて、再生成するターゲットを決定します
- ビルドコマンドを実行する