Makefileを作ってビルドしよう(超初級編)


Cの入門書を進めてる途中(進捗だめです)

もう何回目の入門だよって感じですけどこれやってます

C言語本格入門 ~基礎知識からコンピュータの本質まで


make……?makefile?

巷によくある入門書みたいにただ単にコンパイルするだけじゃなくてmakefileを作成してコンパイルを通すやり方で進んでいくので、実践に近い形になってます。(なってるそうです)


無知だった自分

実際にmakeでコンパイルを業務でしたことがあるにもかかわらず、読み進めて「これ実行ファイルの名前を変えてるだけなのにわざわざMakefile作る必要なくね?」と思ってしまったのですが、それをツイッターで呟いたらソースファイルが数百数千個あるでっかいプロジェクトでは便利というありがたいツッコミがございました

全く恥ずかしいことにこれまで現場で散々(といっても半年くらいですが)makeのお世話になってたはずなのに、どう書くかもどんなメリットがあるかも知らずにいました


Makefileをどうやって書くのか


Makefile.hoge

PROGRAM = hoge

OBJS = hoge.o
SRCS = $(OBJS:%.o=%.c)
CC = gcc
CFLAGS = -g -Wall
LDFLAGS =

$(PROGRAM):$(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LDLIBS)


※PROGRAM行のCCの後ろはタブです。

どんな意味があるかを上から解説します。

PROGRAM:プログラム名で、実行ファイルの名前になります

OBJS:リンクするオブジェクトファイル名をスペース区切りで列挙。hoge.o fuga.oみたいに続けて書くことで複数ファイルを指定できる……って認識であってますかね?

SRCS:ソースコードのファイル名指定。ここではOBJSの拡張子を.cにすることでコンパイル対象をhoge.cにしています。

CC:Cコンパイラのコマンド名。ここではgcc

CFLAGS:コンパイルのオプション指定。ここではデバッガ用の-gと警告を厳しくする-Wallを指定してます。

LDFLAGS:リンカのオプション指定(よくわかってないので割愛。特殊なライブラリのリンク等をする際に使用するそうです)

$(PROGRAM):プログラムの生成方法の記述

Makefileの書き方は他にもあるようなので、まだまだ勉強が必要ですね……


Makefileを使ってビルド

$ make -f Makefile.hoge

ビルドの過程はこんな感じです

gcc -g -Wall -c -o hoge.o hoge.c

gcc -g -Wall -o hoge hoge.o

これで実行ファイルhogeが出来るので以下で実行できます。

$ ./hoge


まとめ

・Makefileは大規模開発で便利

・書き方多種多様

……でも、makeいろんな書き方あるってことだけどググっても書籍がオライリー本しか出てこないのはどういうことなの。調べ方が悪い?