#Makefileの基本的な構造
(1.変数の設定)
-------------------
(2.ターゲットと実行)
#1.変数の設定
###CC=
使用するコンパイラ
C言語の場合
CC = gcc
C++の場合
CXX = g++
IntelCコンパイラを使用する場合
CC = icc
###INCLUDE= or INCDIR=
インクルードするディレクトリの指定をする。
初期値
INCLUDE = -I./include
e.g.
INCDIR = -I /usr/local/include -I /usr/include
###CFLAGS =
Cコンパイルのオプション
CFLAGSにて設定する各オプションについて
オプション | 内容 |
---|---|
-Wall | 全ての警告を出力する |
-O2 | コードの最適化レベル gccのデフォルトは-O0 |
-D | マクロ定義 |
-g | デバッグ用の情報を保存する |
... |
e.g.
CFLAGS = -Wall -O2 $(INCDIR)
###LDFLAGS =
リンク用のディレクトリを指定する。
e.g.
LDFLAGS = -L /usr/lib -L /usr/local/lib
###LIBS =
ライブラリ用のファイルを指定をする。
e.g.
LDFLAGS = -l 〇〇〇 -l 〇〇〇.a
###OBJS =
生成されるオブジェクト名を指定する。
e.g.
OBJS = 〇〇〇.o
#2.ターゲットと実行
##ターゲット(実行ファイル)と依存ファイル
ターゲット(実行ファイル)と依存ファイルを:区切りで記述します。
e.g
〇〇〇.out:〇〇〇1.o 〇〇〇2.o 〇〇〇3.o
その他にターゲットは型ルールやコマンドに使われます(後述)。
###よく使われる自動変数(マクロ)
マクロ | 内容 |
---|---|
$< | 最初の依存するファイルの名前 |
$@ | ターゲットファイル名 |
... |
#ターゲット(型ルール)と処理
※古い手法としてサフィックスルールが使われていましたが、現在では型ルールが一般的です。
サフィックスルール | 型ルール | 内容 |
---|---|---|
.c.o: | %.o : %.c | 〇〇.cというファイルに対して〇〇.oを生成する |
.o.out: | %.out : %.o | 〇〇.oというファイルに対して〇〇.outを生成する |
... |
e.g.
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
test1.c test2.cというファイルがあればtest1.oとtest2.oが生成される。
#ターゲット(コマンド)と処理
make cleanなどのコマンドを実行した時の処理を記述する。
コマンド名 | 処理内容 |
---|---|
all | 全てを実行する処理を記述する |
clean | 生成されたファイルを削除する処理を記述する |
install | installコマンドを用いてどこに何をインストールするかの処理を記述する |
... |
e.g.
clean:
rm -f *.out
rm -f *.o