[Linux] Linux プロジェクト自動化ビルド ツール — make/Makefile

1. make/Makefileとは

メイクファイル

Windows では、VS や VS Code などの ide を使用して C/C++ プログラムを記述し、プロジェクトを実装した後、これらの ide はこれらのプログラムの実行可能ファイルを処理および生成するのに役立ちます。

しかし、Linux では、このプロジェクトを自分で命令によって実装する必要がある場合、プロジェクト内のソース ファイルはカウントされず、種類、機能、モジュールごとにいくつかのディレクトリに配置されます。一つで便利です。

また、Linux はプロジェクト自動コンパイル ツールを提供しますMakefile。これは、指定する一連のルールを定義し、最初にコンパイルする必要があるファイル、後でコンパイルする必要があるファイル、再コンパイルする必要があるファイル、さらにはより複雑な機能操作を実行する必要があります。一度 Makefile を書いてしまえば、make コマンドは 1 つだけで済み、プロジェクト全体が完全に自動でコンパイルされるため、ソフトウェア開発の効率が大幅に向上します。

したがって、Makefileが書けるかどうかは、大規模なプロジェクトをやり遂げる能力があるかどうかという側面を示しています。

作る

make は、makefile の命令を説明するコマンド ツールです。一般的に言えば、Delphi の make、Visual C++ の nmake、Linux の GNU の make など、ほとんどの IDE にこのコマンドがあります。Makefile がエンジニアリングのコンパイル方法になっていることがわかります。

次のように: Makefile を使用して C 言語ファイル hello.c の実行可能ファイルを生成します. C
ここに画像の説明を挿入
プログラマーの開発環境がターミナル経由で接続された Linux 1 つだけの場合、複雑なプロジェクトを構築するための選択肢はほぼ Makefile だけです。グローバリゼーションの分水嶺でもありますが、Linux を学ぶには Makefile が十分に重要です。

要約:

Linux では、make はコマンド、Makefile はファイルであり、この 2 つが相互に補完し合い、プロジェクトの「自動ビルド」を実現します。

2.メイクファイルのロジック

1.単純な依存関係

Makefile は主にとで構成さ依赖关系依存関係はで構成されます依赖方法目标依赖

最も古典的な形式は次のとおりです。

target:dependence  #依赖关系
  command          #依赖方法

このうち、targetは生成されるターゲットであり、ターゲットがdependence必要とする依存関係を生成することであり、両者は依存関係を形成し、ターゲットが実行するコマンドを生成するcommandことです。

知らせ:

  • 依存関係に複数の依存関係がある場合もあれば、依存関係がない場合もあります
  • Makefile は、他の make では認識できない makefile としても記述できます。(この記事は Makefile です)
  • 各依存関係は [Tab] キーで開始する必要があります

上記のテスト コードを例にとります。

ここに画像の説明を挿入
hello ファイルを生成するには、hello.c ファイルに依存する必要があり、最終的に次の依存関係を通じてターゲット ファイルの hello を生成します。

2. 複雑な依存関係

上記のテスト ケースでは、このディレクトリ内のファイルです。その中のファイルがこのディレクトリ内依赖关系ない場合、システムは生成時に Makefile 内で同じファイルを自動的に検索します。見つかったファイルがまだない場合このディレクトリ 次に、上記の操作を繰り返します。(システムはスタックの結果を使用して動作します)依赖依赖关系依赖目标文件其它目标文件

まず、上記のテスト ケースを次のように変更します。
ここに画像の説明を挿入

  • hello ファイルを生成し、hello.o ファイルに依存する
  • hello.o ファイルを生成し、hello.s ファイルに依存する
  • hello.s ファイルを生成し、hello.i ファイルに依存する
  • hello.i ファイルを生成し、hello.c ファイルに依存する
  • hello.c ファイルはこのディレクトリにあります。直接使用してください。

hello ファイルを生成すると、他の 3 つのファイルが生成目标文件され、このディレクトリに格納されます。
ここに画像の説明を挿入

依存関係は次のとおりです。

ここに画像の説明を挿入

  • 他の目标文件場所の変更target1は生成に影響しません。これ依赖は Makefile ファイルの下で同じ検索であり目标文件、ターゲット ファイルとは関係ありません位置上記の方法を引き続き使用して、ファイルを生成します。

3.makeコマンド

1.メイクの使い方

Linux では、make コマンドを入力すると、システムは現在のディレクトリで Makefile を検索し、ファイル内の最初の依存関係と依存メソッドを実行し、依存メソッドを画面に出力して、ターゲット ファイルを生成します。

上記の Makefile テスト ケースを次のように変更します
ここに画像の説明を挿入
。 2 セットの依存関係を生成します。(クリーンについては後述します)

make テストに合格するには、次のようにします。

ここに画像の説明を挿入
生成された Makefile 内の他のターゲット ファイルを削除する場合は、ターゲット ファイルを指定する必要があります。

make target1 target2   #make后可以有多个target目标文件
  1. ターゲットにする

ここに画像の説明を挿入

  1. ターゲット1をターゲット2にする

ここに画像の説明を挿入

2.クリーンアップ

プロジェクトでは、いくつかの不要なファイルが常にクリーンアップされており、cleanそれらをプロジェクトのクリーンアップの対象ファイルとして使用することがよくあります。

クリーニング ファイルは他のファイルに依存する必要がないため、clean には依存関係がありません。

clean が Makefile の最初のターゲット ファイルでない場合、前のテストと同様に、make の後に clean を追加してコンパイルする必要があります。

ここに画像の説明を挿入

3. 偽のターゲット

.PHONY次の形式で、疑似ターゲットと呼ばれる変更されたターゲットを使用します。

.PHONY:target

機能: ファイルを常に実行可能にする

make を複数回使用して同じターゲット ファイルを生成すると、コンパイルは最初は成功しますが、その後は失敗し、次の結果が得られます。

ここに画像の説明を挿入
この時点で.PHONY、ターゲット ファイル hello を変更して、常にコンパイルできる疑似ターゲットにすることができます。

ここに画像の説明を挿入
.PHONY注:変更が使用された後に常にコンパイルできるだけでなく、次のように、クリーンなオブジェクト ファイルも常にコンパイルできます。

ここに画像の説明を挿入

4. make はどのようにコンパイルするかどうかを決定しますか?

上記でテストしましたが、使用しない場合.PHONY、make は 1 回しか使用できず、その後はコンパイルできません。

プロジェクトを書き終えてそれを実装したいとき (通常、プロジェクトは非常に大きく、テストしたポイントではありません)、多くの時間とパフォーマンスを浪費します.ファイルが変更された場合、プロジェクトを再実装して実行可能ファイルを生成できます。

make は、ソース ファイルとターゲット ファイルの変更時刻の比較に基づいて、再コンパイルするかどうかを判断します。

  1. ソースファイルの変更時間がターゲットファイルの変更時間よりも短い場合、コンパイルしない
  2. ソースファイルの変更時間がターゲットファイルの変更時間よりも大きい場合にコンパイルする

Linux では、各ファイルには次のように 3 つの時間が含まれます。

  • アクセス時間 (Access): cat、vim、less など、ファイルの内容に最後にアクセスした時間。
  • 変更時刻 (Modify): nano、vim など、ファイルの内容が最後に変更された時刻。
  • 変更時刻 (Change): nano/vim (ファイル サイズの変更)、

statコマンドを使用して、これら 3 回のファイルを表示できます

ここに画像の説明を挿入

アクセス時間の影響

make が繰り返しコンパイルされるかどうかを判断するために、2 つの数値の変更時間を比較する必要があるのはなぜですか?

Linux では、cat、less命令によってファイルへのアクセスを実行できます。これら 2 つの命令によってアクセスされたファイルは、次の 2 つの理由により、自身のアクセス時間を変更しません。

  1. LInux ではファイルへのアクセスは非常に頻繁な操作であり、ファイルのアクセス時刻を変更するには毎回 IO 操作が必要であり、アクセス時刻を毎回変更するとシステムの負担が大きくなります。
  2. ファイルが読み取り可能かどうかは、ファイルのパーミッションによって決まります. ファイルが読み取り可能であるということは、ファイルの所有者およびグループが読み取りを推奨していないことを意味し、アクセス時刻を毎回変更する必要はありません.時間。

したがって、Linux のアクセス時間は、次の 2 つのケースで変化します。

  1. アクセスが一定回数、または一定時間溜まると更新されます
  2. ファイルの変更時刻が変わると、それに応じて変更されます
    ここに画像の説明を挿入

ここに画像の説明を挿入

  • 上記の写真はvimチェックインファイルのみを使用しており、変更していませんが、変更時間も時々変わります

要約すると、ファイルが変更されたかどうかを判断したい場合は、変更時刻が変更されたかどうかを判断できます。

注: 変更時間は変更され、ファイルは必ずしも変更されません。

変更時間の影響

ソースファイルの変更時刻が変わったということは、ソースファイルが変更されたことを意味します. このときは、make を使用して再度コンパイルします. まず、vim を使用して変更時刻を更新
ここに画像の説明を挿入
ここに画像の説明を挿入
し、touch コマンドを使用して更新していることを判断します.常にソースファイル (touch file: ファイルの作成はありません。常にファイルを更新するためにファイルが存在します)、make を実行するかどうかを判断することは、ソースファイルの内容を変更するかどうかとは関係ありません。 . 上記の知識から、 makeがコンパイルされているかどうかはソースファイルの変更時間に関連していると
ここに画像の説明を挿入
結論付けることができ、ターゲットファイルがコンパイルされているかどうかは変更時間に応じて判断されないことがわかり、効果が得られます常にコンパイルされています。,PHONY

おすすめ

転載: blog.csdn.net/m0_52094687/article/details/128638478