Linux CプログラミングMakefile作成初歩

3301 ワード

ソースコードは次のようなプログラムがあるとします.
/* main.c */ 
#include "mytool1.h" 
#include "mytool2.h" 
#include<stdio.h>
int main(int argc,char **argv) 
{ 
mytool1_print("hello"); 
mytool2_print("hello"); 
} 
/* mytool1.h */ 
#ifndef _MYTOOL_1_H 
#define _MYTOOL_1_H 
void mytool1_print(char *print_str); 
#endif 

/* mytool1.c */ 
#include "mytool1.h" 
void mytool1_print(char *print_str) 
{ 
printf("This is mytool1 print %s
",print_str);
} 

/* mytool2.h */ 
#ifndef _MYTOOL_2_H 
#define _MYTOOL_2_H 
void mytool2_print(char *print_str); 
#endif 

/* mytool2.c */ 
#include "mytool2.h" 
void mytool2_print(char *print_str) 
{ 
printf("This is mytool2 print %s
",print_str);
} 

<上記のコードの句読点が英語で入力されているか注意してください>
もちろんこのプログラムは短いのでコンパイルできます
gcc -c main.c 
gcc -c mytool1.c 
gcc -c mytool2.c 
gcc -o main main.o mytool1.o mytool2.o 
これでmainプログラムも生成でき、時々面倒になります.しかし、もしある日ファイル(例えばmytool 1.c)を変更したら、上のコマンドを再入力しますか?これは簡単に解決できると言えるかもしれませんが、SHELLのスクリプトを書いて、彼女に完成させてくれればいいのではないでしょうか.はい、このプログラムにとって、役に立ちます.しかし、私たちがもっと複雑に考えているとき、もし私たちのプログラムに何百ものソースプログラムがあれば、コンパイラももう一度コンパイルしなければなりませんか?
そのため、賢いプログラマーたちはこのことをするのに良いツールを考え出しました.これがmakeです.私たちは以下のmakeを実行すれば、上の問題を解決することができます.makeを実行する前に、非常に重要なファイルを作成します.--Makefile.上記のプログラムでは、Makefileのファイルは次のようになります.
これは上のプログラムのMakefileファイルです
main:main.o mytool1.o mytool2.o 
TAB gcc -o main main.o mytool1.o mytool2.o 
main.o:main.c mytool1.h mytool2.h 
TAB gcc -c main.c 
mytool1.o:mytool1.c mytool1.h 
TAB gcc -c mytool1.c 
mytool2.o:mytool2.c mytool2.h 
TAB gcc -c mytool2.c 

<上のTABはTABを押してスペースを補う必要があり、スペースキーを押すことはできません.TABを押してからgccに直接負けてください.スペースを入れないでください.>
このMakefileファイルがありますが、私たちはいつソースプログラムの中のどんなファイルを修正しましたか.私たちはmakeコマンドを実行すれば、私たちのコンパイラは私たちが修正したファイルに関するファイルをコンパイルするだけで、他のファイルは彼女が処理したくありません.
次はMakefileがどのように書かれているかを学びます.
Makefileでも#の最初の行はすべてコメント行です.Makefileで最も重要なのは、ファイルの依存関係の説明です.一般的なフォーマットは次のとおりです.
target:components 
TAB rule 
最初の行は依存関係を表します.2行目はルールです.例えば、私たちの上のMakefileファイルの2行目です.
main:main.o mytool1.o mytool2.o 
私たちのターゲットmainを表す依存オブジェクトはmainです.o mytool1.omytool2.o依存するオブジェクトがターゲット修正後に修正されると、ルール1行で指定されたコマンドを実行します.私たちの上のMakefileの3行目のようにgcc-o main mainを実行します.o mytool1.o mytool2.o注意ルール1行のTABは、そこがTABキーであることを示す
Makefileには3つの非常に有用な変数があります.それぞれ$@,$^,$<の意味はそれぞれ:
$@--ターゲットファイル、$^--すべての依存ファイル、$<--最初の依存ファイル. 
上記の3つの変数を使用すると、Makefileファイルを簡略化できます.
これは簡略化されたMakefileです
main:main.o mytool1.o mytool2.o 
gcc -o $@ $^ 
main.o:main.c mytool1.h mytool2.h 
gcc -c $< 
mytool1.o:mytool1.c mytool1.h 
gcc -c $< 
mytool2.o:mytool2.c mytool2.h 
gcc -c $< 
簡略化された後、私たちのMakefileは少し簡単ですが、人々は時々簡単にしたいと思っています.ここではMakefileのデフォルトルールについて学びます
.c.o: 
gcc -c $< 
この規則はすべてを表す.oファイルはすべて依存して対応する.cファイルの.例えばmytool.o mytoolに依存する.cこれでMakefileは次のようになります.
もう一度簡略化したMakefileです
main:main.o mytool1.o mytool2.o 
gcc -o $@ $^ 
.c.o: 
gcc -c $< 
さて、私たちのMakefileもあまり悪くありません.Makefileルールについてもっと知りたいなら、対応するドキュメントを見ることができます.