のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Makefileとは(いちいちコンパイル打つコマンド覚えるのめんどくさいよな貴方へ)

Sponsored Links

皆さんこんにちは
お元気ですか。私は汗をかいています
要は暑いのです。

さて、本日はMakefileについて
皆さんMakefileを書いたこと有りますか?
使ったことない人、知らない人は是非使ってみましょう。

What is Makefile?

makeコマンドを実行した時に
それに従い、プログラムを実行するのですが、そのプログラムの実行方法を記載するようなファイルがMakefileです。

ぶっちゃけ、リンクコマンドなんて覚えられないので、makeで実行します。

実際に作ってみよう

準備

まずは、動作させる用のC++のファイルを生成します。

#include <iostream>

using namespace std;

int main(int argc, char const *argv[]){
	cout << "test" << endl;
	return 0;
}

次に「Makefile」というファイル名で以下の内容を記載してください

test:test.cpp
	g++ test.cpp

因みに、

target:依存ファイル
  実際のコマンド

となっております。

target:Makefileのコマンドのようなもの(どんなコマンドを実行するかの名前みたいなもの)
依存ファイル:変更がなければ、コマンドを実行しない
実際のコマンド:実際に動作させるプログラム

実行

さて以下のコマンドを打ってみましょう。

make test

実際にa.outのファイルができあがってると思うので実行するとtestと表示されているはずです。

手順を変更したコンパイル

分割してコンパイルするとき、オブジェクトを大量に生成しますよね?
そのようなときのコンパイルをやってみましょう。

準備

まずは動作させるためのファイルを準備してみましょう

calc.hpp
#include <iostream>
using namespace std;

extern int add(int a,int b);
calc.cpp
#include "calc.hpp"

int add(int a,int b){
	return a + b;
}
test.cpp
#include <iostream>
#include "calc.hpp"

using namespace std;

int main(int argc, char const *argv[]){
	cout << "test" << endl;
	cout << add(1,2) << endl;
	return 0;
}
Makefile
all:test calc exec

test: test.cpp
	g++ -c test.cpp

calc: calc.hpp calc.cpp
	g++ -c calc.cpp

exec: test.o calc.o
	g++ test.o calc.o -o exec

新しい表現が出てきましたね。
all:test calc exec ですが、後半はターゲットを連ねています。
つまり、test calc execコマンドを順番に実行するといった内容です。
こうしておくとmake allを押したら全ての実行が終了している状態になります。

make all
g++ -c test.cpp
g++ -c calc.cpp
g++ test.o calc.o -o exec

ちなみにこの後execだけ実行すると

make exec
make: `exec' is up to date.

既に最新ですとのこと、必要がないものについては実行しないことになります。
そのため、リコンパイルし直したくなった場合は以下のコマンドが実装されていることは度々あります。

clean:
   rm *.o