目次
1. メイクファイルとは
プロジェクトに C ファイルが 1 つまたは 2 つしかない場合は問題ありませんし、入力するコマンドもそれほど多くありません。ファイルが数十、数百、さらには数万ある場合、ターミナルを使用して GCC コマンドを入力するのは明らかに非現実的です。 。どのファイルをコンパイルする必要があり、どのファイルを再コンパイルする必要があるかを記述したファイルは Makefile と呼ばれます。Makefile はスクリプト ファイルと同じで、Makefile 内でシステム コマンドを実行することもできます。
2. 使用上の注意
1. プロジェクト ディレクトリに「Makefile」という名前のファイルを作成します。ファイル名は必ず「Makefile」にする必要があります。!!大文字と小文字は区別されます。
2. 行の先頭で空にする必要があるコード内のすべての場所では、「TAB」キーを使用する必要があります。スペースバーは使用しないでください。
3. Makefile 内の変数はすべて文字列です。$(オブジェクト)
4. コメントは「#」です!
3. Make の実行プロセス:
1. make コマンドは、現在のディレクトリで Makefile という名前のファイル (実際には makefile を使用できます) を検索します。
2. Makefile が見つかると、Makefile で定義されたルールに従ってコンパイルされ、最終的なターゲット ファイルが生成されます。
3. ターゲットファイルが存在しない場合、またはターゲットが依存するファイルがターゲットファイルより新しい場合(つまり、最終更新時刻がターゲットファイルより遅い場合)、以下のコマンドが実行されます。ターゲットを更新します。
4、Makefile構文
1. 正則化形式
目标...: 依赖...
命令1
命令2
...
main : main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
2. 4つの割り当て方法
= 変数の実際の値は、変数が参照する最後の有効な値によって異なります。
:= は、後で定義された変数を使用せず、以前に定義された変数のみを使用します。
?= 変数が以前に割り当てられていない場合、この変数は現在の ?= 割り当てになります。以前に割り当てられている場合は、以前に割り当てられた値を使用します。
+= 変数に追加します。いくつかの文字列を追加するのと同じです。
3. モードの正規化
パターン ルールでは、ルールのターゲット定義に少なくとも "%" が含まれている必要があります。それ以外の場合は一般的なルールです。ターゲット内の "%" はファイル名との一致を意味し、"%" は空でない文字列を意味します。 「%.c」などの任意の長さは、ワイルドカードと同様に、.c で終わるすべてのファイルです。
%.o : %.c
命令
4. オートメーション変数
いわゆる自動変数とは、この種の変数が、パターンに適合するすべてのファイルが取り出されるまで、パターンで定義された一連のファイルを 1 つずつ自動的に取り出すことを意味します。自動変数は、次のコマンドでのみ出現します。ルール。
$@は対象ファイルを示します
$^ はすべての依存ファイルを意味します
$< は最初の依存ファイルを示します
$? ターゲットよりも新しい依存ファイルのリストを示します
5. 偽りの標的
一般ターゲット名は生成されるファイルであり、擬似ターゲットは実際のターゲット名を表すものではなく、make コマンド実行時にこの擬似ターゲットを指定すると、ルールで定義されたコマンドがその位置で実行されます。
疑似ターゲットの使用は主に、Makefile で定義されたターゲットと作業ディレクトリ内の実際のファイルの間の名前の競合を回避するために使用されます。
clean:
rm *.o
rm main
作業ディレクトリにファイル clean が存在することはありません。「make clean」と入力すると、必ず次の「rm *.o」と「rm main」が実行されます。しかし、実際に作業ディレクトリに「clean」という名前のファイルを作成する場合は異なります。「make clean」を実行すると、依存ファイルが存在しないため、ターゲットは最新のものとみなされます。ルールに従っているため、次の rm コマンドは実行されず、事前に考えていたプロジェクトのクリーンアップ機能は完了しません。この問題を回避するには、次の方法で clean を疑似ターゲットとして宣言します。
.PHONY : clean
clean を false ターゲットとして宣言した後、現在のディレクトリに「clean」という名前のファイルがあるかどうかに関係なく、「make clean」と入力すると、ルールの背後にある rm コマンドが実行されます。
6. メイクファイルの状態判定
<条件关键字>
<条件为真时执行的语句>
endif
<条件关键字>
<条件为真时执行的语句>
else
<条件为假时执行的语句>
endif
条件キーワードは、ifeq、ifneq、ifdef、および ifndef の 4 つです。
等しいかどうかの判定には ifeq を使用し、等しくないかどうかの判定には ifneq を使用します。ifeq は次のように使用されます。
ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数 1 >’,‘ <参数 2>’
ifeq “<参数 1>”, “<参数 2>”
ifeq “<参数 1>”, ‘<参数 2>’
ifeq ‘<参数 1>’, “<参数 2>”
ifdef と ifndef の使用法は次のようになります。「変数名」の値が空でない場合、式は true、そうでない場合、式は false になります。
ifdef <变量名>
7. メイクファイル機能
Makefile 内の関数はすでに定義されており、それらを直接使用し、カスタム関数はサポートしていません。関数の使用方法は次のとおりです。
$(函数名 参数集合)
${函数名 参数集合}
パラメータセットは関数の複数のパラメータであり、パラメータはカンマ「,」で区切られ、関数名とパラメータは「スペース」で区切られ、関数呼び出しは「$」で始まります。
<1>、関数サブセット
関数 subst は文字列置換を完了するために使用されます。
$(subst <from>,<to>,<text>)
文字列 <text> 内の <from> の内容を <to> に置き換えると、関数は置き換えられた文字列を返します。
<2>、関数 patsubst
関数 patsubst は、パターン文字列の置換を実行するために使用されます。
$(patsubst <pattern>,<replacement>,<text>)
この関数は、文字列 <text> 内の単語がパターン <pattern> に一致するかどうかを確認し、一致する場合は <replacement> に置き換えます。<pattern> では、ワイルドカード "%" を使用して任意の長さの文字列を表すことができます。戻り値は置換された文字列です。「%」が <replacement> にも含まれている場合、<replacement> の「%」は、<pattern> の「%」で表される文字列になります。次に例を示します。
$(patsubst %.c,%.o,ac bc cc)
文字列「ac bc cc」の「%.c」に一致する文字列をすべて「%.o」に置換し、置換後の文字列は「ao bo co」になります。
<3>、関数ディレクトリ
ディレクトリを取得するには関数 dir を使用します。使用方法は次のとおりです。
$(dir <names…>)
この関数は、ファイル名シーケンス <names> からディレクトリ部分を抽出するために使用され、戻り値はファイル名シーケンス <names> のディレクトリ部分です。次に例を示します。
$(dir </src/a.c>)
ファイル「/src/ac」のディレクトリ部分「/src」を抽出します。
<4>、関数 notdir
notdir 関数は、ファイル内のディレクトリ部分を削除、つまりファイル名を抽出します。
$(notdir <names…>)
この関数は、次のようなファイル名シーケンス <names> からファイル名の非ディレクトリ部分を抽出するために使用されます。
$(notdir </src/ac>)
ファイル「/src/ac」のディレクトリ以外の部分、つまりファイル名「ac」を抽出します。
<5>、foreach関数
$(foreach <var>, <list>,<text>)
この関数は、パラメータ <list> 内の単語を 1 つずつ取り出してパラメータ <var> に入れ、<text> に含まれる式を実行します。
# 定义一个列表
fruits := apple banana cherry
# 使用 foreach 迭代列表,并为每个元素打印一行信息
$(foreach fruit,$(fruits),echo $(fruit);)
# 输出
apple
banana
cherry
<6>、関数ワイルドカード
ワイルドカード文字「%」はルール内でのみ使用でき、ルール内でのみ展開されます。変数定義および関数の使用時にワイルドカード文字が自動的に展開されない場合は、この時点で関数ワイルドカードが使用されます。使用方法は次のとおりです。
$(wildcard PATTERN…)
たとえば、次のコードは、現在のディレクトリ内のすべての .c ファイルを取得するために使用されます。これは、関数が「%」と同等であることを意味します。
$(ワイルドカード *.c)