これを行うための最も一般的なツールがmake
です。レシピは実行されたディレクトリのMakefile
というファイルからレシピを読み取り、必要なタスクを実行します。プロジェクトのどの部分を再コンパイルする必要があるかを検出するには、ファイルのタイムスタンプを確認するだけで十分です。 Makefile
でのインデントはタブではなくスペースを使用しなければならないこと
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS := -lm
PROGS := number_input
.PHONY: all clean
all: $(PROGS)
clean:
rm -f $(PROGS)
$(PROGS): %: %.c
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected]
注:ここでは例のMakefileがあります。上記をコピーしてファイルに貼り付ける場合、インデントを修正するにはsed -e 's|^ *|\t|' -i Makefile
を実行する必要があります。
コンパイラが使用した最初の3行の名前、コンパイラオプション、およびリンクオプション。特定のユースケースでは、-lm
リンクオプションは必要ありません。あなたは遅かれ早かれ、<math.h>
を使用したいので、それを含めたばかりです。そして、-lm
リンクオプションを含める必要があります。
PROGS
プログラム名は、複数指定することもできます。スペースで区切るだけです。
.PHONY:
はmake
のターゲットにall
とclean
がその名前のファイルを生成しないことを示しています。
Makefile
の最初のレシピとしてall
レシピは、make
を実行したときのデフォルトのレシピです。これは、PROGS
にリストされているすべてのプログラムをビルドする必要があることを示しています。
clean
レシピ(実行make clean
)はすべての一時ファイルとコンパイル済みファイルをディレクトリから削除します。
最後のレシピはトリッキーなものです。 PROGS
にリストされているすべてのファイルは、同じ名前のファイルと接尾辞が.c
で作成されています。 $^
は、ファイル名が.c
、ファイル名が[email protected]
であることを示します。
このMakefile
が先生に電子メールを介しての練習を返すために使用された場合、私はまた、新しい.PHONY
ターゲット、tarball
追加したい:number_input.c
が後に変更されている場合make
は、number_input
をコンパイルします実行
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS := -lm
PROGS := number_input
TAR := $(notdir $(CURDIR)).tar
.PHONY: all clean tarball
all: $(PROGS)
clean:
rm -f $(PROGS)
tarball: clean
rm -f ../$(TAR)
tar -cf ../$(TAR) $(notdir $(CURDIR))/
$(PROGS): %: %.c
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected]
は、最後にnumber_input
がコンパイルされた場合、またはnumber_input
がまだ存在しない場合
make TAR=myname-ex01.tar tarball
を実行すると、現在のディレクトリからコンパイルされたファイルが削除され、親ディレクトリの現在のディレクトリ(およびサブディレクトリがある場合)のtarballがmyname-ex01.tar
として作成されます。 make tarball
を実行すると、tarファイル名は現在のディレクトリの名前と同じになりますが、接尾辞は.tar
です。
私はMakefile
を書くことがなぜ有用であるかを見ることができたら幸いです。
Makefileを使用する必要があります。 – piwi
あなたはMakefileを使うことができました。また、CMakeやNinja、bfg9000、gyp、または... – You
を使うこともできますが、コンパイルされるファイルは1つだけなので何もしません! –