C++ で Makefile を使用する
この記事では、C++ で Makefile を使用する方法の複数の方法を示します。
C++ で Makefile を使用してマルチファイルプログラムを簡単にコンパイルする
Makefile
は、プログラムのソースファイルとコンパイルされるヘッダーの関係を説明するファイルの名前です。このファイルは、コマンドラインで呼び出される make
ユーティリティによって使用され、コードプロジェクトのミニビルドシステムとして機能します。ただし、make
はプログラミング言語だけでなく、プログラムのコンパイルにも限定されません。相対ファイルで行われた変更に基づいてファイルを更新する必要があるシナリオで利用できるためです。関係は、特定のアクションを説明する一連のルールによって表されます。次のスニペットは、一般的なルールの構造を示しています。target
は通常、実行可能ファイルまたはオブジェクトファイルの名前です。prerequisites
は通常、ターゲットファイルを出力するために必要な入力ファイルです。recipe
は make
によって実行されるアクションであり、新しい行ごとにタブでインデントされます。make
は、現在の作業ディレクトリに存在する場合、makefile
または Makefile
という名前のファイルをスキャンすることに注意してください。
target: prerequisites
recipe
ルールは唯一必要な部分であるため、Makefile
の主要部分です。次の例は、program
という名前の実行可能ファイルをビルドする単純な Makefile
構造を示しています。現在、program
には prerequisites
-main.o
と library1.o
があります。これらは以下のルールから出力されるオブジェクトファイルです。どちらにも、特定の前提条件をコンパイルして特定の出力を取得するそれぞれのレシピがあります。g++
コマンドは、レシピの一部として実行される GNU C++ コンパイラであり、通常のコマンドライン引数を使用して構築できることに注意してください。
program : main.o library1.o
g++ -o program main.o library1.o
main.o : main.cpp header1.h
g++ -c main.cpp
library1.o : library1.cpp library1.h
g++ -c library1.cpp
Makefile
のもう 1つの機能は、C++ プリプロセッサマクロ式と同様に動作する変数です。つまり、ファイルに複数回出現する文字列の名前エイリアスを定義し、変数名を配置できます。たとえば、次のスニペットは、ファイルの先頭で定義された OBJ
変数を示しており、最初のルールで繰り返されるプログラム
の前提条件が含まれています。ただし、変数は、はるかに長い文字列が置換される場合に最も効率的であることに注意してください。
OBJ = main.o library1.o
program : $(OBJ)
g++ -o program $(OBJ)
main.o : main.cpp header1.h
g++ -c main.cpp
library1.o : library1.cpp library1.h
g++ -c library1.cpp
さらに、コンパイラまたはリンカのフラグを表す可能性のある他の変数を定義できます。これらは通常、Makefile
の複数の場所で使用されます。したがって、プロジェクトが大きく、Makefile
が大きくなると、指定されたパラメーターのすべてのインスタンスを変更するよりも、1 行を変更する方が簡単です。
OBJ = main.o library1.o
CC = g++
LFLAGS = -lm
program : $(OBJ)
$(CC) -o $(LFLAGS) program $(OBJ)
main.o : main.cpp header1.h
$(CC) -c main.cpp
library1.o : library1.cpp library1.h
$(CC) -c library1.cpp