logo

Linuxのmakeコマンド

リナックス 作る コマンドは、ソース コードからプログラムとファイルのグループを構築および維持するために使用されます。 Linux では、これは開発者によって最も頻繁に使用されるコマンドの 1 つです。これは、開発者がターミナルから多くのユーティリティをインストールしてコンパイルするのに役立ちます。さらに、大規模なプロジェクトのコンパイル プロセスも処理します。コンパイル時間を節約します。

make コマンドの主な目的は、大きなプログラムを部分に分割し、再コンパイルする必要があるかどうかを確認することです。また、再コンパイルに必要な命令も発行します。

C++ プログラミング言語はオブジェクト指向言語であるため、このセクションでは C++ プログラムを使用しますが、マシンにインストールされている任意の言語を使用できます。それはプログラムだけに限定されるものではありません。これを使用して他のタスクを記述することもできます。

makeコマンドはどのように機能するのでしょうか?

make コマンドはターゲットを引数として受け取ります。これらの引数は「Makefile」で指定します。 Makefile には、ターゲットと、これらのターゲットに関連する関連アクションが含まれています。

make コマンドを実行すると、makefile を検索してスキャンしてターゲットを見つけ、その依存関係にアクセスします。依存関係が指定されていない場合は、依存関係を検索して構築します。依存関係が構築された後、メイン ターゲットが構築されます。

たとえば、ソース ファイルを 1 つだけ変更する場合、make コマンドを実行します。したがって、これにより、そのソース ファイルに接続されているオブジェクト ファイルのみがコンパイルされます。プロジェクトの最終コンパイルにかかる時間を大幅に節約できます。

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

make コマンドは、makefile の実行を呼び出します。これは、プロジェクトを維持するために作成したシェル コマンドを含む特別なファイルです。 Makefile には、実行するターゲットとコマンドが含まれています。複数のメイクファイルを作成することはできません。別のディレクトリを作成することをお勧めします。

最近のファイルを追跡するため、必要なファイルのみを更新します。多数のソース ファイルを含む大規模なプログラムがある場合は、すべての依存ファイルを再コンパイルする必要があります。したがって、非常に時間がかかるプロセスになる可能性があります。

Makefile には標準のリストが含まれています。これらの標準は、システムが実行したいコマンドを理解するのに役立ちます。これらの規格は 2 つの部分に分かれており、改行で区切られています。最初の行は 依存関係行、 後続の行は次のようにみなされます。 アクションまたはコマンド s.コマンドは新しい行でタブで区切られます。

依存関係 各ファイルとソースファイルの関係を指定します。そしてその 目標 は実行ファイルであり、makeコマンドの実行後に作成されます。

オプション

make コマンドを使用すると、さまざまなオプションを利用してより具体的にすることができます。いくつかの重要なオプションは次のとおりです。

    -b、-m:これらのオプションは、make コマンドのさまざまなバージョンの互換性を無視するために使用されます。-B、 --always-make:これらのオプションは、無条件にすべてのターゲットを作成するために使用されます。-C ディレクトリ、--ディレクトリ=ディレクトリ:これらのオプションは、メイクファイルを実行する前にディレクトリを変更するために使用されます。-d:デバッグ情報を出力するために使用されます。--debug[=FLAGS]:これは、通常の処理とともにデバッグ情報を出力するために使用されます。フラグをスキップすると、「-d」オプションと同様の結果が表示されます。-e、--環境オーバーライド:これは、環境の優先順位から取得した変数を makefile に提供するために使用されます。-f ファイル、--file=ファイル、--makefile=ファイル:ファイルをメイクファイルとして使用するために使用されます。-i、--ignore-errors:「-i」オプションは、コマンド内のすべてのエラーを無視するために使用されます。-I ディレクトリ、--include-dir=dir:指定したメイクファイルを検索するディレクトリを指定するために使用されます。 '-I' オプションを多数指定すると、指定された順序で多数のディレクトリが検索されます。-j [ジョブ]、--ジョブ[=ジョブ]:同時に実行するジョブの数を指定するために使用されます。多くの「-j」オプションを指定すると、最後のオプションが実行されるとみなされます。ジョブの数を指定しない場合、同時に実行できるジョブは制限されません。-k、--継続:エラーが発生した後、可能な限りプログラムを続行するために使用されます。-l [ロード]、--load-average[=ロード]:これは、他のタスクがキュー内にあり、負荷平均が最小である場合、新しいタスクを開始しないことを指定するために使用されます。-n、--just-print、--dry-run、--recon:実行されるコマンドを表示するために使用されます。-o ファイル、--old-file=ファイル、--assume-old=ファイル:これは、ファイルがその依存関係よりも古い場合でも、make がファイルを再作成しないことを保証するために使用されます。-O[タイプ]、--output-sync[=タイプ]:これは、各タスクの出力が他のタスクの出力が混在するのではなく、まとめられていることを確認するために使用されます。 「-j」オプションを使用して複数のジョブを処理する場合に便利です。-p、--print-database:これは、メイクファイルの読み取り後に生成されるデータベースを出力するために使用されます。 「-v」オプションと一緒に使用すると、バージョン情報を出力することもできます。ファイルを再作成せずにデータベースを出力するには、次のようにコマンドを実行します。
    make -p -f/dev/null。-q、--質問:「-q」オプションは次の目的で使用されます。 質問モード。 コマンドは実行されず、何も出力されません。指定されたターゲットがすでに同期されている場合にのみ、終了ステータスがゼロになります。それ以外の場合は、ゼロ以外の終了ステータスが表示されます。-r、--no-builtin-rules:これは、組み込みの暗黙的なルールの使用を排除するために使用されます。-R、 --no-builtin-variables:組み込み変数を定義したくない場合に便利です。-s、--silent、--clean:これらのオプションは次のように呼ばれます サイレント動作。 これは、コマンドの実行時に印刷することを制限します。-S、--継続しない、--停止:「-k, --keep-running」操作の効果をキャンセルするために使用されます。-t、--touch:コマンドを実行する代わりにファイルを操作するために使用されます。 - 痕跡:これは、各ターゲットの性質を追跡するために使用されます。-v、--バージョン:これは、make ユーティリティのインストールされているバージョンを出力するために使用されます。さらに、作成者、著作権、および make ユーティリティに関するいくつかの通知のリストが表示されます。-w、--印刷ディレクトリ:これは、他の処理の前後に、作業ディレクトリを含む印刷メッセージを追跡するために使用されます。再帰的 make コマンドの複雑な構造からエラーを追跡するのに役立ちます。--no-print-directory:「-w」オプションをオフにするために使用されます。-W ファイル、--what-if=ファイル、--new-file=ファイル、--assume-new=ファイル:これらのオプションは、ターゲット ファイルが変更されたばかりであるかのように見せます。--warn-未定義変数:このオプションは、未定義の変数が参照されていることを警告するために使用されます。

make コマンドの例をいくつか理解してみましょう。 Makefile の基本的な使い方を見て、さらにいくつかの C++ プログラムと Makefile を作成します。 make コマンドをよりよく理解するために、それらに対していくつかの操作を実行します。

Java に相当する

makeコマンドの基本的な使い方

make コマンドの非常に基本的な使用法を理解しましょう。これがどのように機能するかを理解するのに役立つかもしれません。

ディレクトリ「project」を作成し、そこにディレクトリを変更します。以下のコマンドを考えてみましょう。

 mkdir project cd project 

今すぐ作成してください 「メイクファイル」 最初のプログラムには次の内容が含まれます。

 say_hello: echo 'Hello World!' 

上記のファイルから、say_hello は任意のプログラミング言語の関数のように動作するターゲットであり、echo はアクションとみなされます。アクションは、 タブ。 ターゲットとアクションが一緒になってメイクファイルのルールを作成します。ここで、次のように make コマンドを実行します。

以下の出力を考えてみましょう。

Linux フォルダーの名前を変更
Linuxのmakeコマンド

上記の出力から、echo 操作自体が表示されていることがわかります。出力に echo コマンドを表示したくない場合は、次で始まる echo を実行します。 「@」 シンボル。エコーを抑制するには、メイクファイルの内容を次のように更新します。

 say_hello: @echo 'Hello World!' 

以下の出力を考えてみましょう。

Linuxのmakeコマンド

ターゲットは、アクションに依存するバイナリ ファイルである場合があります。

makefile に、generate や list などのターゲットをさらにいくつか追加してみましょう。次のようにメイクファイルを更新します。

 say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

make コマンドを実行すると、最初のターゲットが makefile のデフォルトのターゲットであるため、最初のターゲットのみが実行されます。以下の出力を考えてみましょう。

Linuxのmakeコマンド

以下の内容をメイクファイルに含めることで、デフォルトのターゲットを変更できます。

 .DEFAULT_GOAL := generate 

次のようにファイルの最初の行に追加します。

Linuxのmakeコマンド

上記の makefile は、デフォルトの目標として「generate」を考慮します。 make コマンドを実行すると、次のような出力が得られます。

Linuxのmakeコマンド

DEFAULT GOAL オプションは、すべてのオプションを使用する複数のターゲットを指定するために、1 つのターゲットのみを実行します。複数のターゲットを指定するには、メイクファイルの最初の行を次のように更新します。

 all: say_hello generate 

指定されたターゲットを実行します。以下の出力を考えてみましょう。

Linuxのmakeコマンド

すべてのターゲットを実行できるようにする別のオプションがあります。メイクファイルのすべてのターゲットを実行したい場合は、次のようにファイルを更新します。

 .PHONY: all say_hello generate list say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

上記のファイルは、指定されたすべてのターゲットを実行します。 make コマンドを実行して、以下の出力を検討してください。

Linuxのmakeコマンド

make コマンドの高度な使用法

ファイル main.cpp、function1.cpp、function2.cpp と依存関係ファイル function.h を含む C++ プロジェクトを作成しましょう。

ファイルのコードは次のとおりです。

Javaのコメント

メイン.cpp:

 #include #include 'functions.h' int main() { print_hello(); std::cout<< std::endl; std::cout<< 'The factorial of 5 is' << factorial(5) << std:: endl; return 0; } 

関数1.cpp:

 #include 'functions.h' int factorial(int n) { if(n!=1) { return (n * factorial(n-1)); } else return 1; } 

関数2.cpp:

 #include #include 'functions.h' void print_hello() { std::cout << 'Hello World'; } 

関数.h:

 void print_hello(); int factorial (int n); 

次に、以下のコマンドを実行して、上記のプロジェクトの実行可能ファイルを作成します。

 g++ main.cpp function1.cpp function2.cpp -o hello 

上記のコマンドにより実行可能ファイルが作成されます 'こんにちは' ファイル main.cpp、function1.cpp、および function2.cpp の。

以下の出力を考えてみましょう。

Linuxのmakeコマンド

上記の出力から、正常に実行された場合は何も出力されません。

Makefile を使用して同じタスクを実行してみましょう。

としてファイルを作成します メイクファイル そしてその中に以下のコードを入れます。

 all: g++ main.cpp function1.cpp function2.cpp -o hello 

ターゲットには all キーワードを使用し、改行に上記と同じコマンドを TAB 付きで記述して操作を指定します。ファイルを保存します。以下のファイルについて考えてみましょう。

Linuxのmakeコマンド

操作するには以下のようにコマンドを実行します。

動的配列Java
 make 

上記のコマンドは、指定されたファイルの実行可能ファイル「hello」を作成します。以下の出力を考えてみましょう。

Linuxのmakeコマンド

Makefile にさらにタスクを追加してみましょう。タスクを追加する 'コンパイル' 次のように:

 all: compile: g++ main.cpp function1.cpp function2.cpp -o hello 

タスクを実行するには コンパイル、 以下のコマンドを実行します。

 make compile 

上記のコマンドはコンパイル タスクを実行します。以下の出力を考えてみましょう。

Linuxのmakeコマンド

メイクファイルに対してさらにいくつかのタスクを実行してみましょう。

次のように Makefile を更新します。

 all: hello hello: main.o function1.o function2.o g++ main.o function1.o function2.o -o hello main.o: main.cpp g++ -c main.cpp function1.o: function1.cpp g++ -c function1.cpp function2.o: function2.cpp g++ -c function2.cpp clean: rm -rf *o hello 

上記の Makefile から、main.o、function1.o、function2.o という 3 つのオブジェクトを作成しました。さらに、ターゲット main.o、function1.o、および function2.o の依存関係を、それぞれ main.cpp、function1.cpp、および function2.cpp として提供しました。すべてのターゲットは、その中で指定されたタスクを実行します。また、すべての依存関係をクリーンアップして実行可能ファイルを削除するクリーン ターゲットも指定しました。

ここで、make all コマンドを実行して、新しい makefile を実行します。

 make all 

以下の出力を考えてみましょう。

Linuxのmakeコマンド

上記の出力から、コマンドが最初に main.o、function1.o、および function2.o をそれぞれ実行したことがわかります。指定されたファイルの実行可能ファイルとオブジェクト ファイルが作成されます。 hello でクリーン ターゲットを指定していないため、クリーン ターゲットは実行されません。以下のファイルについて考えてみましょう。

Linuxのmakeコマンド

make コマンドには単純な作業プロセスがあります。 all オプションを実行し、hello に進みました。 hello の実行後、指定された順序でターゲットを読み取ります。すべてのターゲットとその依存関係を検索し、それらを順番に実行します。

オブジェクトと実行可能ファイルを削除するには、クリーン タスクを実行します。クリーン タスクを実行するには、次のようにコマンドを実行します。

 make clean 

以下の出力を考えてみましょう。

Linuxのmakeコマンド

上記のコマンドは、すべてのオブジェクトと実行可能ファイルを削除します。以下のディレクトリのスナップを参照してください。

Linuxのmakeコマンド

上の画像から、ディレクトリがクリーンアップされたことがわかります。

makeコマンドの変数

Makefile で変数を定義できます。変数を定義するには、 '=' オペレーター。たとえば、変数 A を作成し、それにコマンド gcc を割り当てたい場合は、次のように割り当てます。

rj12 vs rj11
 A=g++ 

これをメイクファイルで次のように使用します。

 hello: hello.cpp ${A} hello.cpp -o hello 

これは次のように端末に渡されます。

 g++ hello.cpp -o hello 

${A} の代わりに $(A) を使用できます。スクリプトではどちらも同じように扱われます。

メイクファイル内のコメント

メイクファイルにコメントを追加するには、 「#」 シンボル。たとえば、コンパイルセクションにコメントを追加するには、次のように追加します。 '# これでプログラムがコンパイルされます 。」コメントはコンパイラによって無視されます。