make

「make」の編集履歴(バックアップ)一覧はこちら

make」(2010/12/03 (金) 13:26:25) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

* make [#odf8c44a] Contents #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] だれかお願いします Back to [[Effective C++ Lite]]
* make [#odf8c44a] Contents #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] だれかお願いします Back to [[Effective C++ Lite]]

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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