Makefileとは(いちいちコンパイル打つコマンド覚えるのめんどくさいよな貴方へ)
皆さんこんにちは
お元気ですか。私は汗をかいています
要は暑いのです。
さて、本日は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