リナックス 作る コマンドは、ソース コードからプログラムとファイルのグループを構築および維持するために使用されます。 Linux では、これは開発者によって最も頻繁に使用されるコマンドの 1 つです。これは、開発者がターミナルから多くのユーティリティをインストールしてコンパイルするのに役立ちます。さらに、大規模なプロジェクトのコンパイル プロセスも処理します。コンパイル時間を節約します。
make コマンドの主な目的は、大きなプログラムを部分に分割し、再コンパイルする必要があるかどうかを確認することです。また、再コンパイルに必要な命令も発行します。
C++ プログラミング言語はオブジェクト指向言語であるため、このセクションでは C++ プログラムを使用しますが、マシンにインストールされている任意の言語を使用できます。それはプログラムだけに限定されるものではありません。これを使用して他のタスクを記述することもできます。
makeコマンドはどのように機能するのでしょうか?
make コマンドはターゲットを引数として受け取ります。これらの引数は「Makefile」で指定します。 Makefile には、ターゲットと、これらのターゲットに関連する関連アクションが含まれています。
make コマンドを実行すると、makefile を検索してスキャンしてターゲットを見つけ、その依存関係にアクセスします。依存関係が指定されていない場合は、依存関係を検索して構築します。依存関係が構築された後、メイン ターゲットが構築されます。
たとえば、ソース ファイルを 1 つだけ変更する場合、make コマンドを実行します。したがって、これにより、そのソース ファイルに接続されているオブジェクト ファイルのみがコンパイルされます。プロジェクトの最終コンパイルにかかる時間を大幅に節約できます。
メイクファイルとは何ですか?
make コマンドは、makefile の実行を呼び出します。これは、プロジェクトを維持するために作成したシェル コマンドを含む特別なファイルです。 Makefile には、実行するターゲットとコマンドが含まれています。複数のメイクファイルを作成することはできません。別のディレクトリを作成することをお勧めします。
最近のファイルを追跡するため、必要なファイルのみを更新します。多数のソース ファイルを含む大規模なプログラムがある場合は、すべての依存ファイルを再コンパイルする必要があります。したがって、非常に時間がかかるプロセスになる可能性があります。
Makefile には標準のリストが含まれています。これらの標準は、システムが実行したいコマンドを理解するのに役立ちます。これらの規格は 2 つの部分に分かれており、改行で区切られています。最初の行は 依存関係行、 後続の行は次のようにみなされます。 アクションまたはコマンド s.コマンドは新しい行でタブで区切られます。
の 依存関係 各ファイルとソースファイルの関係を指定します。そしてその 目標 は実行ファイルであり、makeコマンドの実行後に作成されます。
オプション
make コマンドを使用すると、さまざまなオプションを利用してより具体的にすることができます。いくつかの重要なオプションは次のとおりです。
make -p -f/dev/null。
make コマンドの例をいくつか理解してみましょう。 Makefile の基本的な使い方を見て、さらにいくつかの C++ プログラムと Makefile を作成します。 make コマンドをよりよく理解するために、それらに対していくつかの操作を実行します。
Java に相当する
makeコマンドの基本的な使い方
make コマンドの非常に基本的な使用法を理解しましょう。これがどのように機能するかを理解するのに役立つかもしれません。
ディレクトリ「project」を作成し、そこにディレクトリを変更します。以下のコマンドを考えてみましょう。
mkdir project cd project
今すぐ作成してください 「メイクファイル」 最初のプログラムには次の内容が含まれます。
say_hello: echo 'Hello World!'
上記のファイルから、say_hello は任意のプログラミング言語の関数のように動作するターゲットであり、echo はアクションとみなされます。アクションは、 タブ。 ターゲットとアクションが一緒になってメイクファイルのルールを作成します。ここで、次のように make コマンドを実行します。
以下の出力を考えてみましょう。
Linux フォルダーの名前を変更
上記の出力から、echo 操作自体が表示されていることがわかります。出力に echo コマンドを表示したくない場合は、次で始まる echo を実行します。 「@」 シンボル。エコーを抑制するには、メイクファイルの内容を次のように更新します。
say_hello: @echo 'Hello World!'
以下の出力を考えてみましょう。
ターゲットは、アクションに依存するバイナリ ファイルである場合があります。
makefile に、generate や list などのターゲットをさらにいくつか追加してみましょう。次のようにメイクファイルを更新します。
say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls
make コマンドを実行すると、最初のターゲットが makefile のデフォルトのターゲットであるため、最初のターゲットのみが実行されます。以下の出力を考えてみましょう。
以下の内容をメイクファイルに含めることで、デフォルトのターゲットを変更できます。
.DEFAULT_GOAL := generate
次のようにファイルの最初の行に追加します。
上記の makefile は、デフォルトの目標として「generate」を考慮します。 make コマンドを実行すると、次のような出力が得られます。
DEFAULT GOAL オプションは、すべてのオプションを使用する複数のターゲットを指定するために、1 つのターゲットのみを実行します。複数のターゲットを指定するには、メイクファイルの最初の行を次のように更新します。
all: say_hello generate
指定されたターゲットを実行します。以下の出力を考えてみましょう。
すべてのターゲットを実行できるようにする別のオプションがあります。メイクファイルのすべてのターゲットを実行したい場合は、次のようにファイルを更新します。
.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 コマンドを実行して、以下の出力を検討してください。
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 の。
以下の出力を考えてみましょう。
上記の出力から、正常に実行された場合は何も出力されません。
Makefile を使用して同じタスクを実行してみましょう。
としてファイルを作成します メイクファイル そしてその中に以下のコードを入れます。
all: g++ main.cpp function1.cpp function2.cpp -o hello
ターゲットには all キーワードを使用し、改行に上記と同じコマンドを TAB 付きで記述して操作を指定します。ファイルを保存します。以下のファイルについて考えてみましょう。
操作するには以下のようにコマンドを実行します。
動的配列Java
make
上記のコマンドは、指定されたファイルの実行可能ファイル「hello」を作成します。以下の出力を考えてみましょう。
Makefile にさらにタスクを追加してみましょう。タスクを追加する 'コンパイル' 次のように:
all: compile: g++ main.cpp function1.cpp function2.cpp -o hello
タスクを実行するには コンパイル、 以下のコマンドを実行します。
make compile
上記のコマンドはコンパイル タスクを実行します。以下の出力を考えてみましょう。
メイクファイルに対してさらにいくつかのタスクを実行してみましょう。
次のように 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
以下の出力を考えてみましょう。
上記の出力から、コマンドが最初に main.o、function1.o、および function2.o をそれぞれ実行したことがわかります。指定されたファイルの実行可能ファイルとオブジェクト ファイルが作成されます。 hello でクリーン ターゲットを指定していないため、クリーン ターゲットは実行されません。以下のファイルについて考えてみましょう。
make コマンドには単純な作業プロセスがあります。 all オプションを実行し、hello に進みました。 hello の実行後、指定された順序でターゲットを読み取ります。すべてのターゲットとその依存関係を検索し、それらを順番に実行します。
オブジェクトと実行可能ファイルを削除するには、クリーン タスクを実行します。クリーン タスクを実行するには、次のようにコマンドを実行します。
make clean
以下の出力を考えてみましょう。
上記のコマンドは、すべてのオブジェクトと実行可能ファイルを削除します。以下のディレクトリのスナップを参照してください。
上の画像から、ディレクトリがクリーンアップされたことがわかります。
makeコマンドの変数
Makefile で変数を定義できます。変数を定義するには、 '=' オペレーター。たとえば、変数 A を作成し、それにコマンド gcc を割り当てたい場合は、次のように割り当てます。
rj12 vs rj11
A=g++
これをメイクファイルで次のように使用します。
hello: hello.cpp ${A} hello.cpp -o hello
これは次のように端末に渡されます。
g++ hello.cpp -o hello
${A} の代わりに $(A) を使用できます。スクリプトではどちらも同じように扱われます。
メイクファイル内のコメント
メイクファイルにコメントを追加するには、 「#」 シンボル。たとえば、コンパイルセクションにコメントを追加するには、次のように追加します。 '# これでプログラムがコンパイルされます 。」コメントはコンパイラによって無視されます。