C++ で Makefile を使用する

胡金庫 2022年4月12日
C++ で Makefile を使用する

この記事では、C++ で Makefile を使用する方法の複数の方法を示します。

C++ で Makefile を使用してマルチファイルプログラムを簡単にコンパイルする

Makefile は、プログラムのソースファイルとコンパイルされるヘッダーの関係を説明するファイルの名前です。このファイルは、コマンドラインで呼び出される make ユーティリティによって使用され、コードプロジェクトのミニビルドシステムとして機能します。ただし、make はプログラミング言語だけでなく、プログラムのコンパイルにも限定されません。相対ファイルで行われた変更に基づいてファイルを更新する必要があるシナリオで利用できるためです。関係は、特定のアクションを説明する一連のルールによって表されます。次のスニペットは、一般的なルールの構造を示しています。target は通常、実行可能ファイルまたはオブジェクトファイルの名前です。prerequisites は通常、ターゲットファイルを出力するために必要な入力ファイルです。recipemake によって実行されるアクションであり、新しい行ごとにタブでインデントされます。make は、現在の作業ディレクトリに存在する場合、makefile または Makefile という名前のファイルをスキャンすることに注意してください。

target: prerequisites
	recipe

ルールは唯一必要な部分であるため、Makefile の主要部分です。次の例は、program という名前の実行可能ファイルをビルドする単純な Makefile 構造を示しています。現在、program には prerequisites-main.olibrary1.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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook