はじめに
Linux make
コマンドは、システム管理者と開発者がよく使用するユーティリティです。このコマンドはコンパイル プロセスを支援し、大規模なアプリケーションを構築するための必須ツールです。このユーティリティは繰り返しを省き、コンパイルを高速化し、時間を節約します。
この記事では、Linux make
の使い方を紹介します。 コマンドと例。
前提条件
- ターミナルへのアクセス
make
機能がインストールされました。- テキスト エディタ
注: make
の場合 はシステムで利用できません。sudo apt install make
を使用してください .
make コマンドはどのように機能しますか?
make
コマンドは、さまざまなプログラム部分をコンパイルし、最終的な実行可能ファイルを構築します。 make
の目的 ファイルのコンパイルを自動化して、プロセスをより簡単にし、時間を節約することです。
このコマンドは、シェル コマンドでコンパイラを実行できる限り、任意のプログラミング言語で機能します。
いくつかのファイルを操作する場合、コンパイルは簡単です。したがって、このプロセスには、コンパイラーの呼び出しとファイル名のリストが含まれます。
たとえば、3 つのファイル (file1.c) から C プログラムをコンパイルするには 、file2.c 、file3.h ):
次のコマンドでコンパイラを呼び出します:
gcc file1.c file2.c file3.h
gcc
コマンドは a.out を作成します 標準のコンパイル済み実行可能ファイルです。
ただし、ソース ファイルの 1 つを変更するには、すべてを再コンパイルする必要があり、大規模なアプリを操作する場合はさらに複雑になります。 make
コマンドはプロセスを自動化し、ユーザーがすべてのファイルを再コンパイルすることなく、変更が必要な部分のみを更新できるようにします。
make
コマンドは、ユーザーが生成したファイル Makefile を使用して、プログラムの一部をコンパイルします。初回実行時 make
ファイルの説明や変更時刻などの命令を Makefile から検索します。利用可能なデータに基づくと、make
更新が必要なファイルを決定し、必要なコマンドを発行します。
メイクファイルとは
Makefile は、make
を指示する一連のルールを含むテキスト ファイルです。 アプリケーションの構築方法。ルールは次の 3 つの部分で構成されます:ターゲット 、依存関係 、およびコマンド .
Makefile の基本的な構文は次のとおりです:
target: dependencies
<TAB> commands
構文の一部は次のとおりです:
- ターゲット .
make
の実行後に作成または更新されるファイルの名前 . - 依存関係 .ターゲットが構築されるファイルの名前 (スペースで区切られている)。
- コマンド .依存関係が変更されたときにターゲットを作成または更新する方法を説明するルール
1 つの Makefile には、いくつかのルール セットがあります。 最初のルールがデフォルトのルールです そして、まだ作成されていないオブジェクト ファイル (依存関係) から最終的な実行可能ファイル (ターゲット) を作成する方法を示します:
この場合の構文は次のとおりです:
EXECUTABLE: Object file 1, Object file 2
<TAB> commands
注: Makefile のコマンドは常に TAB の後に来ます 鍵。そうしないと、コマンドは機能しません。
ルール 1 を設定した後、ユーザーはオブジェクト ファイルの作成方法に関する指示を追加します。
make
コマンドは、ソース ファイルをオブジェクト ファイルにコンパイルしてから、オブジェクト ファイルをターゲット ファイル (最終的な実行可能ファイル) にコンパイルすることによって機能します。上記の 3 つの規則を使用した Makefile の構文は次のとおりです。
EXECUTABLE: Object file 1, Object file 2
<TAB> commands
Object file 1: Source file 1, Source file 2
<TAB> commands
Object file 2: Source file 2
<TAB> commands
Linux の make コマンド構文
基本的な make
構文は次のようになります:
make [OPTIONS]
引数なしで実行すると、make
Makefile から最初のターゲットをビルドします。
Linux make コマンド オプション
make
コマンドは、その有効性、多様性、および特定のアクションを実行する機能により、広く使用されています。コマンドはオプションなしで実行すると結果を出力しますが、引数を追加すると make
が展開されます の 使いやすさ。
最もよく使用されるオプションは次のとおりです:
コマンド | 説明 |
---|---|
-B , --always-make | すべてのターゲットを無条件にコンパイルします。 |
-d , --debug[=FLAGS] | デバッグ情報を出力します。 |
-C dir , --directory=dir | Makefile を実行する前にディレクトリを変更します。 |
-f file , --file=file , --Makefile=FILE | 特定のファイルを Makefile として使用します。 |
-i , --ignore-errors | コマンドのすべてのエラーを無視します。 |
-I dir 、--include-dir=dir | 指定した Makefile を検索するディレクトリを指定します。 |
-j [jobs] 、--jobs[=jobs] | 同時に実行するジョブの数を指定します。 |
-k 、--keep-going | make を実行し続けます エラーが発生した後、できるだけ長く。 |
-l [load] , --load-average[=load] | 他のタスクがキューにある場合、新しいタスクを開始しないことを指定します。 |
-n , --dry-run , --just-print 、--recon | make を実行せずに期待される出力を出力します . |
-o file 、--old-file=file , --assume-old=file | make であることを保証します 依存関係よりも古いファイルであっても、ファイルを再作成しません。 |
-p , --print-data-base | Makefile を読み取った後に生成されたデータベースを出力します。 |
-q , --question | make の質問モードを有効にします コマンドを実行しませんが、ターゲットが既にコンパイルされている場合は終了ステータス 0 を返します。 |
-r , --no-builtin-rules | 組み込みの暗黙のルールを排除します。 |
-s 、--silent 、--quiet | 実行時にコマンドを出力することを制限します。 |
-S , --no-keep-going 、--stop | 「-k 」を停止 , --keep-going "コマンド。 |
-t 、--touch | コマンドを実行する代わりにファイルに触れます。 |
--trace | 各ターゲットの性質を追跡します。 |
-W file 、--what-if=file 、--new-file=file , --assume-new=file | ターゲット ファイルが変更されているという事実を無視します。 |
--warn-undefined-variables | 不明な変数が参照されていることを警告します。 |
Linux make コマンドの例
make
を理解するための最良の方法 Makefile は、単純なプログラムでコマンドとさまざまなオプションを実行することによって行われます。
たとえば、"Learn about Makefiles" というメッセージを出力する実行可能ファイルをビルドするには、 、次の手順に従ってください:
1. Test という名前のディレクトリを作成します .
2. 3 つのソース ファイル main.c を作成します。 、text.c 、および text.h :
- main.c - main 関数を含むファイルです (
int main
) 別のファイルから関数を呼び出します。
- text.c - は印刷したい "Learn about Makefiles!" を含むファイルです。
- text.h - 関数の宣言を含むヘッダー ファイルです。ヘッダーは両方の c に含まれています
#include
を含むファイル ヘッダーの内容をコピー/貼り付けするのと同じ目的を持つ引数。
次のセクションでは、make
の一般的な使用例をいくつか示します。 上記の 3 つのファイルの Makefile
注: 以下の例は C 言語で書かれています。
プログラムを作成
プログラムを作成するには 2 つの方法があります:
- gcc コンパイラを呼び出して、標準的な方法でファイルをコンパイルします。この方法は、小規模なプログラムに適しています。
- make と Makefile の使用。
gcc コンパイラでプログラムを作成する
gcc コンパイラは単純なプログラムにのみ使用してください。それ以外の場合は、多数のファイルを操作するときに Makefile を使用してください。
コンパイラでプログラムを作成するには:
1. ターミナルを開き、ファイルを含むディレクトリに移動します。
2. gcc を呼び出す コンパイラを開き、両方の c の名前を入力します ファイル。 c に既に含まれているため、ヘッダーはコンパイルされません。 ファイル。
gcc main.c text.c
3. 現在のディレクトリ内のすべてのファイルを ls
で一覧表示します コマンド:
ls
ターミナルは、新しい実行可能ファイル a.out を示しています ファイルが作成されます。実行可能ファイルは、ファイル エクスプローラーでも表示されます:
コンパイルが成功したかどうかをテストするには、実行可能ファイルを呼び出します:
./a.out
ターミナルは、実行可能ファイルが正常に動作することを示しています。
Make と Makefile を使用してプログラムを作成する
make
でファイルをコンパイルする Makefile は、コンパイラを使用するよりも簡単です。まず、同じディレクトリに新しいテキスト ドキュメントを作成し、Makefile という名前を付けます。 または makefile .
ファイルを開き、基本的な Makefile 構文をガイドラインとして使用します。
1. 新しい実行可能ファイルの名前をターゲットとして入力します (例:my_app.)。
2. オブジェクト ファイル main.o を追加します および text.o 依存関係として。 make
コマンドは、オブジェクト ファイルが変更されるたびにターゲットを再コンパイルします。
3. TAB キーを押します gcc
を呼び出します オブジェクト ファイルのコンパイラ:
<TAB> gcc main.o text.o
4. -o
を追加します フラグを付けて、ターゲットに my_app という名前を付けます。
最初のルールを記述した後、Makefile は次のようになります:
my_app: main.o text.o
<TAB> gcc main.o text.o -o my_app
次に、Makefile に作成方法を指示します。 main.o :
1. main.o を設定します
2. main.c と入力します 依存関係として。 main.c main.o の作成と更新に役立ちます .
3. 次のコマンドを記述して、main.o を更新します。 毎回 main.c 変更:
gcc -c main.c
4. -c
を追加します 新しい実行可能ファイルを作成するのではなく、コードを読み取ってオブジェクト ファイルをコンパイルするだけにするよう Makefile に指示するフラグ。
main.o: main.c
<TAB> gcc -c main.c
text.o を作成するには 、そのファイルをターゲットとして設定し、両方の text.c を追加します および text.h 依存関係として。ただし、gcc
コマンドは text.c
のみをコンパイルします ファイル、ヘッダーはコンパイルされないため:
text.o: text.c text.h
<TAB> gcc -c text.c
Makefile を保存して make
と入力します
make
コマンドは 2 つのオブジェクト ファイルを作成しました (main.o および text.o ) と実行可能ファイル (my_app ).
make が新しいファイルを作成したことを確認するには、ls
を実行します。 もう一度:
ターミナルは、コマンドを実行すると my_app が作成されたことを示しています . my_app を実行するには ファイル、タイプ:
./my_app
プログラムを更新
1 つのソース ファイルが変更されると、make
そのソースファイルに応じてオブジェクトファイルのみを更新します。たとえば、my_app の実行時に表示されるテキストを変更するには from "メイクファイルについて学ぶ " から "私はどこにいますか ?":
1. text.c を開きます テキスト エディタで:
2. テキストを "Where am I?" に変更します。 :
3. ファイルを保存し、ターミナルを開いて make
を実行します :
make
コマンドが text.c の変更を検出しました そのファイルだけを再コンパイルしました。
変更を確認するには、実行可能ファイルを実行します:
./my_app
すべてのファイルをコンパイル
変更されたファイルだけでなく、すべてのファイルをコンパイルするには、-B
を使用します または --always-make
オプション。
たとえば、text.c のテキストを変更するには ファイルを 「Makefile について学ぶ」 に戻します ファイルを保存し、次のように入力します:
make -B
出力は make
であることを示しています 変更されていないものも含め、フォルダー内のすべてのファイルをコンパイルしました。
オブジェクト ファイルの消去
ユーザーが make
を実行したとき 初めて、コマンドはオブジェクト ファイルと実行可能ファイルを作成します。したがって、ソース フォルダーを整理してオブジェクト ファイルをクリーンアップするには、clean
を追加します。 関数を Makefile に追加:
clean:
<TAB> rm *.o my_app
コマンドは以下で構成されます:
- 依存関係のないクリーンなターゲット - ターゲットは常に時代遅れと見なされ、常に実行されます。
-
rm
コマンド - 指定されたオブジェクトを削除します。 *.o
一部 - o の付いたファイルに一致します オブジェクト ファイルと my_app を消去します .
オブジェクト ファイルを消去するには、次を実行します:
make clean
ls
を実行した後 ターミナルには、オブジェクト ファイルと my_app が表示されます。 削除されました。
デバッグ モードで make を実行
make
を実行 デバッグモードで、コンパイルプロセスに関する追加情報を出力します。 make
を実行 -d
で デバッグ出力を表示するオプション:
make -d
メイクファイルとして別のファイルを使用する
デフォルトでは、make
現在のディレクトリで Makefile または makefile という名前のファイルを探します。別のファイルを使用するには、次を実行します:
make -f [file_name]
たとえば、Makefile の名前が my_file の場合 、実行:
make -f my_file
変数を使用する
Makefile の変数は、複数のファイル名、引数、ターゲット、依存関係、コマンド、ソース ディレクトリ、またはその他の項目を表します。さらに、変数は名前で定義され、変数の値と呼ばれるテキストの文字列を表します。
変数を定義するには、=
を使用します .たとえば、gcc
に置き換えます。 変数 C.
で
C=gcc
my_app: main.o text.o
<TAB> $ (C) main.o text.o -o my_app
main.o:main.c
<TAB> $ (C) -c main.c
text.o: text.c text.h
<TAB> $ (C) -c text.c
make
実行時 ターミナルでは、コマンドは C
を読み取ります gcc
の変数 :
結論
このチュートリアルの例を見れば、make
の使い方がわかります。 Linux のコマンドとその仕組み
次に、Linux コマンド チート シートをダウンロードして、その他の重要な Linux コマンドを学習してください。