設定 - Makefile

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

C/C++で記述されたソースコードにおいて、コンパイルする時の定義を記述するMakefileについて記載する。


Makefileとは

Makefileとは、C/C++のコンパイルに必要なコマンド、ソースコード、オプション、依存関係等を定義したファイルのことである。
makeコマンドを実行することにより、Makefileを使用してコンパイルを実行する。

Makefileのメリットは、以下の通りである。

  • コンパイルの手間が減り、ミスも少なくなる。(特に、大規模なプロジェクトであるほど恩恵は大きい)
  • 共通のMakefileを用意することで、開発者間でコンパイルの定義が統一できる。



Makfileの記述方法

以下の例では、C/C++で記述されたソースコードをコンパイルするためのMakeifleを記述している。

# (1) コンパイラの指定(フルパスを記述してもよい)
CC  = g++

# (2) コンパイルオプション
CFLAGS    =

# (3) 実行ファイル名
TARGET  = Sample

# (4) コンパイル対象のソースコード
SRCS    = Sample.cpp

# (5) オブジェクトファイル名
OBJS    = $(SRCS:.cpp=.o)

# (6) インクルードファイルのあるディレクトリパス
INCDIR  = -I../inc

# (7) ライブラリファイルのあるディレクトリパス
LIBDIR  = 

# (8) 追加するライブラリファイル
LIBS    = 

# (9) ターゲットファイル生成
$(TARGET): $(OBJS)
       $(CC) -o $@ $^ $(LIBDIR) $(LIBS)

# (10) オブジェクトファイル生成
$(OBJS): $(SRCS)
       $(CC) $(CFLAGS) $(INCDIR) -c $(SRCS)

# (xx) インストールディレクトリ
DEST     = /usr/local/bin

# (xx) 
LDFLAGS  = -L/usr/local/lib

# (11) make allコマンドを実行することにより、make cleanコマンドとmakeコマンドを実行する。
all: clean $(OBJS) $(TARGET)

# (12) .oファイル、実行ファイル、.dファイルを削除する。
clean:
       -rm -f $(OBJS) $(TARGET) *.d


上記の例において、3つのブロックに分けて説明する。

  1. Makefileに必要な情報
  2. ターゲットの生成
  3. Makefileの実行オプション


Makefileに必要な情報

Makefileに必要な情報を記載する。(コンパイルの下準備)

1. コンパイラ : CC
使用するコンパイラを記載する。
ただし、上記の例では、C++をコンパイルするため、g++としている。

2. コンパイルオプション : CFLAGS
コンパイルに使用するオプションを記述する。
使用できる機能やコンパイル時に出力される警告等を制御することができる。

3. 実行ファイル名 : TARGET
実行ファイル名を決める。

4. コンパイル対象のソースコード : SRCS
コンパイル対象のソースコードを指定する。
ソースファイルが複数ある場合は、以下のように、複数指定する。
SRCS = hoge1.cpp
SRCS += hoge2.cpp
SRCS += hoge3.cpp
5. オブジェクトファイル名 : OBJS
オブジェクトファイルの名称を定義します。
ソースファイル名と同一のオブジェクトファイルを作成することが多い。

6. インクルードファイルのあるディレクトリパス : INCDIR
参照するインクルードファイルが存在するパスを指定する。
なお、インクルードファイル名は不要である。

7. ライブラリファイルのあるディレクトリパス : LIBDIR
参照するライブラリファイルが存在するパスを指定する。

8. 追加するライブラリファイル : LIBS
参照するライブラリファイル名を指定する。


ターゲットの生成

Makefileにおけるターゲットとは、TARGETとOBJSのことを指す。
上記のセクションで示した情報を形成して、オブジェクトファイルと実行ファイルの生成ルールを記述する。

9. ターゲットファイル生成
以下の2行の構成は、ターゲットファイルの生成ルールを記述している。
$(TARGET): $(OBJS)
$(CC) -o $@ $^ $(LIBDIR) $(LIBS)
1行目は、$(TARGET): $(OBJS)と記述して、TARGETがOBJSに依存することを示している。
2行目は、コマンド行であり、リンク対象のライブラリを指定する。
上記の例では、リンクするライブラリを指定しないため、OBJSとの依存関係のみ管理することになる。

10. オブジェクトファイル生成
TARGETが依存するOBJSの生成ルールを指定する。
オブジェクトファイルは、ソースと機械語の中間ファイルに当たるため、ソースコードに依存する。
基本的な記載ルールは、上記のターゲットファイルの生成と同じである。


Makefileの実行オプション

上記の"Makefileに必要な情報""ターゲットの生成"のみでコンパイル可能であるが、
ここでは、makeコマンドのルールを自由に定義することができる。

この設定を使用することにより、効率良くコンパイルできるようになる。
以下に示す2つは、よく使用される設定である。

11. make allコマンドを実行することで、make cleanコマンドとmakeコマンドを実行する。
上記の例では、make allコマンドを実行するだけで、前のビルド時に生成したファイルを削除した上で、再ビルドを実行する。

12. .oファイル、実行ファイル、.dファイルを削除する。
ビルドで生成したファイルを削除する。
上記の例において、削除対象は、オブジェクトファイル、実行ファイル、そしてデフォルトで生成される依存関係ファイルを削除している。