パターンルールを使ったCプロジェクトのMakefile

分割コンパイル、自動依存関係追跡、.cから.oへのパターンルール、クリーンターゲットを持つ完全なCプロジェクト用Makefileを作成します。

Language-Specific

詳細な説明

MakeでCプロジェクトをビルドする

MakeはもともとCプロジェクト用に設計されており、Cコードベースにとって最も自然なビルドツールであり続けています。適切に構成されたC用Makefileは、コンパイルとリンクを分離し、自動オブジェクトファイル生成にパターンルールを使用し、コンパイラオプション用の変数を定義します。

変数の定義

CC      ?= gcc
CFLAGS  ?= -Wall -Wextra -std=c11 -O2
LDFLAGS ?=
LDLIBS  ?= -lm
TARGET  = main
SRCS    = $(wildcard src/*.c)
OBJS    = $(SRCS:.c=.o)
DEPS    = $(OBJS:.o=.d)

?=演算子により、ユーザーはコマンドラインから変数を上書きできます:make CC=clangwildcard関数はすべての.cファイルを検索し、置換参照$(SRCS:.c=.o)はソースファイル名をオブジェクトファイル名に変換します。

パターンルール

%.o: %.c
	$(CC) $(CFLAGS) -MMD -MP -c -o $@ $<

このパターンルールは、対応する.cファイルから任意の.oファイルをビルドする方法をMakeに教えます。-MMD -MPフラグはヘッダファイルの依存関係を自動的に追跡する依存関係ファイル(.d)を生成します。自動変数$@(ターゲット)と$<(最初の前提条件)により、ファイル名の繰り返しが不要になります。

リンク

$(TARGET): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

$^変数はすべての前提条件(すべてのオブジェクトファイル)に展開され、最終的な実行ファイルを作成します。

重要なポイント

  • 開発中は常に-Wall -Wextraを使用して、早期に警告をキャッチする
  • -include $(DEPS)ディレクティブは、まだ存在しなくてもエラーなしで生成された依存関係ファイルを読み込む
  • プリプロセッサフラグ(-I-D)にはCFLAGSとは別にCPPFLAGSを使用する
  • デバッグビルドには-g、リリースビルドには-O2または-O3CFLAGSに追加する

ユースケース

複数のソースファイルを持つCアプリケーションやライブラリのビルドシステムを設定する場合。ヘッダの変更時に自動的に再コンパイルし、デバッグとリリースの設定を明確に分離する必要がある場面で使用します。

試してみる — Makefile Generator

フルツールを開く