Linuxのメイクファイルとは何ですか

青灯夜游
リリース: 2023-04-13 09:23:56
オリジナル
4769 人が閲覧しました

Linux では、makefile はプロジェクト ファイルのコンパイル ルールであり、プロジェクト全体のコンパイルとリンクのルールを記述します。これには、どのファイルをコンパイルする必要があるか、どのファイルをコンパイルする必要がないのかが含まれます。どのファイルを最初にコンパイルする必要があるか、どのファイルをポストコンパイルする必要があるか、どのファイルを再構築する必要があるかなど。

Linuxのメイクファイルとは何ですか

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

1. Makefile とは

Makefile は、単純にプロジェクト ファイルのコンパイル ルールと考えることができ、プロジェクト全体のコンパイルとリンクのルールを記述します。

エンタープライズレベルのプロジェクトには通常、多数のソースファイルが含まれており、機能、種類、モジュールごとに異なるディレクトリに分類されている場合もあれば、1つのディレクトリに複数のプログラムが格納されている場合もあります。

Makefle は、上記のコードの一部をコンパイルする方法の問題を解決するために生まれました。Makefle は、どのファイルを最初にコンパイルするか、どのファイルを後でコンパイルするか、どのファイルをコンパイルするかを決定する一連のルールを定義します。再コンパイルされました。

プロジェクト全体のコンパイルに必要なものはすべて Makefile に記述できます。言い換えれば、Makefile を使用すると、大量のソース ファイルやパラメーターを毎回手動で入力する必要がなく、プロジェクトのコンパイルを自動化できます。

Makefile の利点は、「自律コンパイル」を実現できることです。通常、プロジェクト全体でコンパイル、リンク、さらに複雑な機能を完了するには make コマンドが 1 つだけ必要です。すべての Linux ソース プログラムには Makefile が付属していると言えます。

2. Makefile の利点

  • コードのコンパイルを管理し、コンパイルするファイル、コンパイル順序、再コンパイルが必要かどうかを決定します;

  • コンパイル時間を節約します。ファイルが変更された場合、プロジェクト全体を再コンパイルする必要はなく、このファイルを再コンパイルするだけで済みます。

  • 一度だけです。通常、Makefile は一度だけ書き込む必要があり、後で大幅に変更する必要はありません。

3. 命名規則

一般的に、Makefile の名前は Makefile または makefile として問題ありませんが、多くのソース ファイルの名前は小文字であるため、Makefile を最初に表示できるため、より多くのプログラマが Makefile の名前を使用します。

Makefile に別の名前 (Makefile_demo など) を付けることもできますが、次の方法で使用する必要があります:

make -f Makefile_demo

4. 基本ルール

Makefile の基本ルールは次のとおりです。

シリーズの目的: 依存関係

(TAB) ルール

## 目的 --> 生成する必要のあるターゲット ファイル

依存関係 --> ターゲットの生成に必要なファイル

ルール --> 依存関係からターゲット ファイルを生成する手段files

tab -->

各ルールはタブで始まる必要があります、スペースは許可されません

たとえば、よく gcc テストを作成します。 c -o test, Makefileを使うと次のように書けます:

test: test.c
    gcc test.c -o test
ログイン後にコピー

このうち、1行目のtestが生成対象、test.cが依存関係、2行目がルールですtest.c からテストを生成します。

Makefile に複数の目標が存在する場合がありますが、Makefile は

最初の目標を最終目標として設定します

5. 動作原理

ターゲットの生成:

a. ルール内の依存ファイルが存在するかどうかを確認します;

b . 依存ファイルが存在しない場合は、依存ファイルを生成するルールを探します。

Linuxのメイクファイルとは何ですか

たとえば、上の図では、電卓を生成するルールは gcc main.o add.o sub.o mul.o p.o -o です。Makefil は main をチェックします。 .o まず、add.o、sub.o、mul.o、p.o が存在するかどうかを調べます。存在しない場合は、依存関係ファイルを生成するルールを検索します。

たとえば、main.o の依存関係が欠落している場合、Makefile は以下を調べて main.o を生成するルールがあるかどうかを確認します。ルール gcc main.c -o main.o で main.o を生成できることが判明すると、このルールを使用して main.o を生成し、最終目標の計算ツールを生成します。

プロセス全体は、依存関係を下方向に検索し、コマンドを上方向に実行して最終目標を生成することです。

ターゲットの更新:

a. ターゲットのすべての依存関係を確認します。依存関係が更新されている場合は、ターゲットを再生成します。

b . 対象ファイルが依存ファイルよりも新しい場合は、更新する必要があります。

Linuxのメイクファイルとは何ですか

たとえば、main.c が変更されると、main.o ターゲットが再コンパイルされ、main.o が更新されると、最終ターゲット計算ツールも再コンパイルされます。他のファイルの更新も同様に行われます。

6. コマンド実行

make:

このコマンドを使用して、所定の規則に従って対象ファイルを生成します。

Makefile ファイルの名前が Makefile または makefile ではない場合は、

-f オプションを追加する必要があります (例:

make -f Makefile_demo

##)

#きれいにする:

コンパイル プロセス中に生成された中間ファイル (.o ファイル) と最終ターゲット ファイルをクリアします。

clean という名前のファイルが現在のディレクトリに存在する場合、このコマンドは実行されません。

-->解決策: 疑似ターゲット宣言: .PHONY:clean

特殊記号:

-: を示しますこのコマンドの実行中にエラーが発生しても、後続のコマンドは引き続き実行されます。例:

-rm a.o build/

@: コマンドがエコーなしでのみ実行されることを示します。一般ルールが実行されると、実行ルールが端末に出力されますが、この記号を追加するとコマンドのみが実行され、実行ルールはエコーされなくなります。例:

@echo $(SOURCE)

7. 通常の変数

変数の定義と割り当て:

変数は次のとおりです。直接使用 定義は、次のように値を割り当てることで完了できます。

INCLUDE = ./include/

変数値:

囲みます。次のように括弧で囲み、ドル記号を追加します。

FOO = $(OBJ)

システムには変数が付属しています。

は通常、CC などの大文字です。 、PWD、CFLAGなど。

デフォルト値があるものとないものがあります。たとえば、一般的なものは次のとおりです。

CPPFLAGS: プリプロセッサに必要なオプション (例: -I

CFLAGS: コンパイル中に使用されるパラメータ –Wall –g -c

LDFLAGS ):リンク ライブラリで使用されるオプション -L -l

変数のデフォルト値は変更できます。たとえば、CC のデフォルト値は cc ですが、gcc に変更できます: CC =gcc

8. 自動変数

##一般的に使用される自動変数:##Makefile には多くの自動変数が用意されていますが、一般的に使用されるのは次の 3 つです。使用済み。これらの自動変数はルール内のコマンドでのみ使用でき、他の場所では使用できません。

$@ -->ルールのターゲット

$ルールの最初の依存関係条件

$^ -->ルールすべての依存関係

の条件 例:

app: main.c func1.c fun2.c

gcc $^ - o $@

ここで: $^ main.c func1.c fun2.c を表し、$

パターン ルール:

パターン ルールでは、ターゲットおよび依存関係の条件で % を使用して、ディレクトリ内の main.c、func1.c などの対応するファイルと一致します。 func2.c という 3 つのファイルがある場合、これら 3 つのファイルのコンパイルは 1 つのルールで完了できます:

%.o:%.c

$(CC) –c $

このパターン ルールの意味:

main.o は main.c によって生成され、

func1.o は func1.c によって生成され、

func2 .o は func2.c

によって生成されます。これはパターン ルールの役割であり、ディレクトリ内のすべてのファイルを一度に照合できます。

9. 関数

makefile には数多くの関数が用意されており、以下の 2 つの関数もよく使用されます。

makefile 内のすべての関数には戻り値

が必要であることに注意してください。次の例では、ディレクトリに main.c、func1.c、および func2.c という 3 つのファイルがあると仮定します。

wildcard:

は、指定されたディレクトリ内の指定されたタイプのファイルを検索するために使用されます。次のパラメータは、ディレクトリ ファイル タイプです。例:

src = $ (wildcard ./src/*.c)

この文の意味は次のとおりです。 ./src ディレクトリ内でサフィックス .c を持つすべてのファイルを検索し、それらを変数 src に割り当てます。

コマンドの実行が完了すると、src の値は main.c func1.c fun2.c になります。

patsubst:

次の例のような一致置換を使用して、src ディレクトリから .c で終わるすべてのファイルを検索し、それらを .o ファイルに置き換えます。 , そしてobjに代入します。

obj = $(patsubst %.c ,%.o ,$(src))

src 変数内の .c 接尾辞を持つすべてのファイルを .o に置き換えます。

コマンドの実行後、obj の値は main.o func1.o func2.o

特別に、すべての .o ファイルを obj ディレクトリに置きたい場合は、次のようにします。次の方法を使用します:

ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))

関連する推奨事項: "

Linux ビデオ チュートリアル

以上がLinuxのメイクファイルとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!