Makefileを使ってみたい

Makefile

今日のお話

環境

注意事項

  • 説明に重点を置いているので、順に説明していきます。急いでいる人は下から読んでいくことがオススメです!
  • 間違っていることがあればコメントください!

フォルダ構成

- Project(ディレクトリ)
        |-main.cpp
        |-Hoge.hpp(インタフェースクラス)
        |-HogeSub.hpp
        |-HogeSub.cpp

Makefileの中身の名称

ターゲット:依存ファイル
    コマンド

Makefileを使わない場合

↓みたいな感じでコマンドを順次実行する必要がある

$ g++ -c HogeSub.cpp -o HogeSub.o
$ g++ -c main.cpp -o main.o
$ g++ main.o HogeSub.o

とりあえずMakefile作る

All:
    g++ -c HogeSub.cpp -o HogeSub.o
    g++ -c main.cpp -o main.o
    g++ main.o HogeSub.o

初期進化

変数、依存ファイルを知ると↓みたいになった。

CC = g++
CFLAGS = -g -Wall

All: main.o HogeSub.o
    $(CC) $(CFLAGS) -o main main.o HogeSub.o

mani.o: main.cpp
    $(CC) $(CFLAGS) -o mani.o -c main.cpp

HogeSub.o: HogeSub.cpp
    $(CC) $(CFLAGS) -o HogeSub.o -c HogeSub.cpp

clean:
    rm -f *.o main
  1. All ターゲットが呼び出される
  2. All ターゲットに依存ファイル main.o HogeSub.o と書かれているため、main.o ターゲットが呼び出され、コマンドが実行される(main.oファイルができる)
  3. HogeSub.o ターゲットが呼び出される(HogeSub.oファイルができる)
  4. 依存ファイルが解消されたので、 All ターゲットが呼び出される

-gデバッグ情報、 -Wall は警告オプションを全て有効にする

ちょっとカッコよくなってきたMakefile

コマンドが使えること、サフィックスルールを知ったら↓みたいになった。

CC = g++
CFLAGS = -g -Wall
SRC = $(shell ls *.cpp)
OBJS = $(SRC:%.cpp=%.o)

All:$(OBJS)
    $(CC) $(CFLAGS) -o main $(OBJS)

clean:
    rm -f *.o main

戯言

  • 順に仕組みを知っていけばわかることが多い。
  • Makefileって使わないことが多いのでインプットを増やしていかないと。
  • これで分割コンパイルができるようになったので次は何しようかなー。

トリビアmakefile入門
http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/