c makefile tutorial
このC ++ Makefileチュートリアルでは、Makeツールとmakefileの主な側面について、C ++での利点とアプリケーションを含めて説明します。
どのC ++プロジェクトでも、重要な目標の1つは、プロジェクトの構築を簡素化して、すべての依存関係とプロジェクトファイルを一か所で取得し、それらを一度に実行して、1つのコマンドで目的の出力を取得できるようにすることです。
経験豊富な人のための残りの面接の質問と回答
同時に、プロジェクトファイルのいずれかが変更されるたびに、プロジェクト全体を再度ビルドする手間をかける必要はありません。つまり、プロジェクトで1つまたは2つのファイルが変更されるたびに、これらの変更されたファイルのみを再構築してから続行します。実行で。
=> Easy C ++トレーニングシリーズをお読みください。
これらはまさに、C ++の「make」ツールと「makefiles」によって対処される機能です。このチュートリアルでは、メイクファイルのすべての主要な側面と、C ++でのそれらのアプリケーションについて説明します。
学習内容:
ツールを作る
MakeはUNIXツールであり、プロジェクトのさまざまなモジュールから実行可能ファイルを簡単に構築するためのツールとして使用されます。 makefileのターゲットエントリとして指定されるさまざまなルールがあります。 makeツールはこれらすべてのルールを読み取り、それに応じて動作します。
例えば、 ルールで依存関係が指定されている場合、makeツールにはコンパイルの目的でその依存関係が含まれます。 makeコマンドは、モジュールをビルドしたり、ファイルをクリーンアップしたりするためにmakefileで使用されます。
makeの一般的な構文は次のとおりです。
%make target_label #target_label is a specific target in makefile
例えば 、ファイルをクリーンアップするためにrmコマンドを実行する場合は、次のように記述します。
%make clean #here cleanは、rmコマンドに指定されたtarget_labelです。
C ++ Makefile
makefileは、ターゲットを構築するために「make」コマンドによって使用または参照されるテキストファイルに他なりません。 makefileには、各ファイルのソースレベルの依存関係やビルド順序の依存関係などの情報も含まれています。
それでは、makefileの一般的な構造を見てみましょう。
makefileは通常、変数宣言で始まり、特定のターゲットを構築するための一連のターゲットエントリが続きます。これらのターゲットは、CまたはC ++の.oまたはその他の実行可能ファイル、およびJavaの.classファイルです。
ターゲットラベルで指定された一連のコマンドを実行するための一連のターゲットエントリを作成することもできます。
したがって、一般的なmakefileは次のようになります。
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
makefileの簡単な例を以下に示します。
# a build command to build myprogram executable from myprogram.o and mylib.lib all:myprogram.o mylib.o gcc –o myprogram myprogram.o mylib.o clean: $(RM) myprogram
上記のmakefileでは、2つのターゲットラベルを指定しました。1つは、myprogramおよびmylibオブジェクトファイルから実行可能ファイルをビルドするためのラベル「all」です。 2番目のターゲットラベル「clean」は、「myprogram」という名前のすべてのファイルを削除します。
makefileの別のバリエーションを見てみましょう。
# the compiler: gcc for C program, define as g++ for C++ CC = gcc # compiler flags: # -g - this flag adds debugging information to the executable file # -Wall - this flag is used to turn on most compiler warnings CFLAGS = -g -Wall # The build target TARGET = myprogram all: $(TARGET) $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c clean: $(RM) $(TARGET)
上記の例に示されているように、このmakefileでは、使用しているコンパイラ値(この場合はGCC)を含む変数「CC」を使用します。別の変数「CFLAGS」には、使用するコンパイラフラグが含まれています。
3番目の変数「TARGET」には、実行可能ファイルをビルドする必要があるプログラムの名前が含まれています。
このmakefileのバリエーションの測定上の利点は、コンパイラー、コンパイラーフラグ、または実行可能プログラム名に変更があるたびに、使用した変数の値を変更するだけでよいことです。
MakeとMakefileの例
次のファイルを使用したプログラム例について考えてみます。
- Main.cpp: メインドライバープログラム
- Point.h: ポイントクラスのヘッダーファイル
- Point.cpp: ポイントクラスのCPP実装ファイル
- Square.h: 正方形クラスのヘッダーファイル
- Square.cpp; 正方形クラスのCPP実装ファイル
上記の.cppファイルと.hファイルを使用して、これらのファイルを個別にコンパイルして.oファイルを生成し、mainという名前の実行可能ファイルにリンクする必要があります。
したがって、次にこれらのファイルを個別にコンパイルします。
- g ++ -c main.cpp: main.oを生成します
- g ++ -c point.cpp: ポイントを生成します。o
- g ++ -c square.cpp: square.oを生成します
次に、オブジェクトファイルをリンクして、実行可能メインを生成します。
g ++ -o main main.o point.o square.o
次に、プログラムの特定の部分が更新されたときに、どのファイルを再コンパイルして再生成する必要があるかを決定する必要があります。このために、 依存関係チャート これは、各実装ファイルのさまざまな依存関係を示しています。
以下に、上記のファイルの依存関係チャートを示します。
したがって、上記の依存関係チャートでは、実行可能ファイル「main」がルートにあることがわかります。実行可能ファイル「main」は、オブジェクトファイルで構成されています。 main.cpp、point.cpp、square.cppをそれぞれコンパイルして生成されるmain.o、point.o、square.o。
上記のチャートに示すように、すべてのcpp実装はヘッダーファイルを使用します。上に示したように、main.cppはpoint.hとsquare.hの両方を参照します。これは、ドライバープログラムであり、pointクラスとsquareクラスを使用するためです。
次のファイルpoint.cppはpoint.hを参照します。 3番目のファイルsquare.cppは、square.hとpoint.hを参照します。これは、正方形を描画するためにもポイントが必要になるためです。
上記の依存関係チャートから、.cppファイルまたは.cppファイルによって参照される.hファイルが変更されるたびに、その.oファイルを再生成する必要があることは明らかです。 例えば、 main.cppが変更されたら、main.oを再生成し、オブジェクトファイルを再度リンクして、メインの実行可能ファイルを生成する必要があります。
プロジェクト内のファイルが少ない場合、上記のすべての説明はスムーズに機能します。プロジェクトが巨大で、ファイルが大きくて多すぎると、ファイルを繰り返し再生成することが難しくなります。
したがって、makeファイルを使用して、プロジェクトをビルドし、実行可能ファイルを生成するためのツールを作成します。
メイクファイルのさまざまな部分をすでに見てきました。ファイルには「MAKEFILE」または「makefile」という名前を付け、ソースフォルダに配置する必要があることに注意してください。
次に、上記の例のメイクファイルを書き留めます。
以下に示すように、コンパイラとコンパイラフラグの値を保持する変数を定義します。
CC = g++ CFLAGS = -wall -g
次に、メイクファイルに最初のターゲット、つまり実行可能メインを作成します。したがって、依存関係を持つターゲットを記述します。
main:main.o point.o square.o
したがって、このターゲットを生成するコマンドは次のとおりです。
$(CC) $(CFLAGS) –o main main.o point.o square.o
注意: 上記のコマンドは、実際にはg ++ -wall –g –o main main.o point.osquare.oに変換されます。
次のターゲットは、オブジェクトファイルmain.o、point.o、square.oを生成することです。
main.oを生成するために、ターゲットは次のように記述されます。
Main.o: main.cpp point.h square.h
このターゲットのコマンドは次のとおりです。
$(CC) $(CFLAGS) –c main.cpp
次のファイルpoint.oは、次のコマンドを使用して生成できます。
$(CC) $(CFLAGS) –c point.h
上記のコマンドでは、point.cppをスキップしました。これは、makeが.oファイルが.cppファイルから生成されることをすでに知っているため、.h(インクルードファイル)だけで十分だからです。
同様に、square.oは次のコマンドで生成できます。
$(CC) $(CFLAGS) –c square.h point.h
この例のメイクファイル全体は、次のようになります。
# Makefile for Writing Make Files Example # ***************************************************** # Variables to control Makefile operation CC = g++ CFLAGS = -Wall -g # **************************************************** # Targets needed to bring the executable up to date main: main.o Point.o Square.o $(CC) $(CFLAGS) -o main main.o Point.o Square.o # The main.o target can be written more simply main.o: main.cpp Point.h Square.h $(CC) $(CFLAGS) -c main.cpp Point.o: Point.h Square.o: Square.h Point.h
したがって、3つのC ++ファイルをコンパイルし、オブジェクトファイルから実行可能メインを生成する完全なmakefileがあることがわかります。
Makefileの利点
- 大規模なプロジェクトの場合、makefileを使用すると、体系的かつ効率的な方法でプロジェクトを表現するのに役立ちます。
- Makefileを使用すると、ソースコードがより簡潔になり、読みやすく、デバッグしやすくなります。
- Makefileは、変更されたファイルのみを自動的にコンパイルします。したがって、プロジェクトの一部が変更されたときに、プロジェクト全体を再生成する必要はありません。
- Makeツールを使用すると、一度に複数のファイルをコンパイルできるため、すべてのファイルを1つのステップでコンパイルできます。
結論
Makefileは、ソフトウェア開発に恩恵をもたらします。 C ++ makefileを使用すると、より短時間でソリューションを構築できます。また、プロジェクトの一部が変更されると、メイクファイルはプロジェクト全体を再生成することなく、その部分のみを再コンパイルして再生成します。
C ++ Makefileを使用すると、プロジェクトを体系的かつ効率的に表現できるため、プロジェクトがより読みやすく、デバッグしやすくなります。
このC ++ Makefileチュートリアルでは、makefileとmakeツールについて詳しく説明しました。また、メイクファイルを最初から作成する方法についても説明しました。
=> ここで完璧なC ++トレーニングガイドをチェックしてください。
推奨読書
- 無料でC ++プログラミングを学ぶための70以上の最高のC ++チュートリアル
- Dev C ++ IDE:インストール、機能、C ++開発
- C ++の完全な概要
- VBScriptファイルオブジェクト:CopyFile、DeleteFile、OpenTextFile、テキストファイルの読み取りと書き込み
- Pythonファイル処理チュートリアル:作成、開く、読み取り、書き込みの方法
- UnixファイルシステムコマンドTouch、Cat、Cp、Mv、Rm、Mkdir(パートB)
- 2021年の12の最高のPythonIDEとコードエディタ
- 完璧なコーディング体験のためのトップ15の最高の無料コードエディタ