make

make [#odf8c44a]


Contents

make [#d202e335]

さて,プログラムをコンパイルするときに毎回「g++ -o ...」とコマンドを打つのは大変です.
また,後述する分割コンパイルを行うのに非常に便利なコマンドです.

まず最初に [#o6f55f99]

さて,makeコマンドとはなんでしょうか.
まず,「Hello World」のプログラム(sample.cpp)と同じディレクトリに以下のようなファイルを作ります.
ファイル名は「makefile」or「Makefile」にしてください

makefile
all : sample

sample : sample.cpp
   g++ -o sample sample.cpp
以下のコマンドを打つと以下のようにmakeが実行されます.
amsl$ make
g++ -o sample sample.cpp
これで「sample」ファイルができあがっているはずです.

コンパイルコマンドを打つより,makeと打つだけなのでだいぶ楽になります.
さて,この「makefile」の中身についてですが,まずどのようにコンパイルされているのかを見てみます.
make
コマンドを実行すると「makefile」(「Makefile」)が読み込まれ,まず最初にファイル内に記述されている「all」の部分に書かれている
all : sample
「sample」というファイルを作成しようとします.
コロンで区切られた左側を「ターゲット」と呼び,右側を「依存ファイル」と言います.
「make」コマンドによって自動的に「all」が呼ばれ,その依存ファイルを作ろうとします.
作成するファイル(ターゲット)が決まったら,「sample」ファイルをどう作るのかが書かれている下の行へ移動します.ここではターゲットに「sample」が書かれている
sample : sample.cpp
の部分になります.
ここで右側に書かれている「sample.cpp」は「sample」を作るのに必要な依存ファイルを示しています.
実行ファイルである「sample」は「sample.cpp」をコンパイルして作成するのでこうなります.
実際に「sample」ファイルを作成するためのコマンドを次の行に書きます.
ここで注意が必要です.
   g++ -o sample sample.cpp
の左側には「タブ」が入っています.
スペースではいけません.タブである必要があります.
これを守らないとコンパイルは実行されません.
以上が「makefile」の中身についてでした.


サフィックスルール [#x5386a1e]

しかし,これだけだとmakeのよさがあまり分からないと思います.
例えばコンパイルして作るプログラム名が変わったときに,すべての「sample」の部分を書き換える必要があります.
これは非常に面倒な事になります.

そこで,次のようにmakefileを書き換えます.

CC = g++
TARGET = sample
all : $(TARGET)

$(TARGET) : $(TARGET).cpp
    $(CC) -o $@ $<

ここでmakeを打つと先ほどと同じコマンドが実行されてコンパイルされていると思います.
では,このmakefileがどうなっているのかを見ていきます.

まず1行目の
CC = g++
は変数「CC」に「g++」を定義しています.
この定義によって,最後の行の$(CC)がg++に置き換わる事になり,コンパイルが実行されます.
例えば,このCCに「gcc」を定義した場合,コンパイルコマンドは「gcc」が実行される事になります.

次の行の
TARGET = sample
も上と同様に「TARGET」が「sample」であると定義しています.つまり
$(TARGET)とすると,そこの部分がすべて「sample」という文字に入れ替わります.
これによって,さきほどの「makefile」とはことなり,違うファイルをコンパイルしたい場合に,この「TARGET」の右辺を異なるファイル名にするだけで大丈夫で,「sample」野部分を一生懸命書き換える必要なないのです.

次にコンパイルコマンドである
    $(CC) -o $@ $<
に注目してみましょう.
最初の$(CC)は先程述べたように,この部分は上の定義通り「g++」に書き換わります.
ではこの「$@」と「$<」は一体なんでしょうか?

これらはmakeの特徴でもある「サフィックスルール」と呼ばれるものです.
このサフィックスルールはmakeファイルにおける固有の文法のようなもので,特殊な定義がされています.

まず「$@」はそのコマンドのターゲットを表します.
ここではコマンドのすぐ上の行のコロンの左側である$(TARGET)をさします.
つまり,「sample」を表しています.

では,「$<」は何を表しているのでしょうか?
先ほどのはターゲットを表していたのに対し,これは依存ファイルを示しています.
ここでは「$(TARGET).cpp」を示している事になります.

このようにして,makefileをファイル名などに依存しないものを書く事で,コンパイルが簡易に行えるようになります.
これは,下で述べる分割コンパイルの部分で威力を発揮する事になります.










分割コンパイル [#s34ebda2]

だれかお願いします

最終更新:2010年12月03日 13:26
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。