私のディレクトリには2
ソースファイルが含まれています。a.c
とb.c
です。私は実行ファイルa
をa.c
とb
からb.c
に生成したいと思います。今私はMakefileを書くための1つの方法しか見つけられません:1つのMakefileに複数の実行可能ファイルを生成するには?
all:
gcc -o a a.c
gcc -o b b.c
少し厄介なようですが、より良い方法ですか?私に
私のディレクトリには2
ソースファイルが含まれています。a.c
とb.c
です。私は実行ファイルa
をa.c
とb
からb.c
に生成したいと思います。今私はMakefileを書くための1つの方法しか見つけられません:1つのMakefileに複数の実行可能ファイルを生成するには?
all:
gcc -o a a.c
gcc -o b b.c
少し厄介なようですが、より良い方法ですか?私に
all:
gcc -o a a.c
gcc -o b b.c
は正常に見えます。 またはmakefile
make a #run cc -o a a.c by make or
make b #run cc -o b b.c by make
または両方a
とb
make a b
make
用途を発生させることなく、コンパイルするあまり知られてトリックより良好な制御のために、以下の
all: a b
a: a.c
gcc -o a a.c
b: b.c
gcc -o b b.c
clean:
-rm a b
であってもよいです暗黙のここでは、魔法のように支配する。 しかし、ルールにメイクを好むが
を指定された私は、次の方法が優れていると思う:
お使いのバージョンでall: a b
a: a.c
gcc -o a a.c
b: b.c
gcc -o b b.c
、make all
は常に実行gcc
二回、変更されたかどうかa.c
とb.c
ます。このバージョンでは、gcc
は必要なときにのみ実行されます。
もちろん、いくつかの魔法(for
-loopなど)を使ってルールを作成することはできますが、私とあなたの方法の違いは明らかです。
make
の基本的な機能は必要に応じて、入力ファイルからの出力ファイルを作成することです:
あなたはマジックを使うことができますが、メイクファイルを使うと、私は通常、シンプルで明示的なものが賢明でわかりにくいと感じています(メイクファイルでは、 '賢い'と '半分の賢い'対称性を強調するので、パターンルール( '%:%.c'と' gcc -o $ @ $ <')はここで正当化されます。 –
答えはまだ、私はあなたがどのようにmake
作品にいくつかの洞察力が必要だと思う、罰金です。 make
は、タイムスタンプを比較することによって必要なものを決定します。入力ファイルが作成された出力ファイルより新しい場合、この出力ファイルのレシピが実行されます。
これはall
という名前だけのルールで、このルールはは常に実行(あなたが最近ファイルを持って起こる場合を除き、実際にがall
と呼ばれる意味 - この動作を防ぐために、あなたは.PHONY
としてall
をリストする必要がありターゲット、つまり実際にファイルを作成していないもの)。オリジナルのMakefileはシンプルなシェルスクリプトと同等なので、make
は正しく使用されません。
あなたのMakefileの最低限の "正しい" バージョンは次のようになりますが:
all: a b
a: a.c
gcc -o a a.c
b: b.c
gcc -o b b.c
.PHONY: all
ので、all
は "偽" であるとa
とb
に依存します。 a
は、a.c
が変更された場合にのみ再構築されます。は、b.c
が変更された場合にのみ再構築されます。実際のプロジェクトで
make
を利用することができます:それは
オブジェクトファイル、あなたの翻訳単位のを構築持っているので、のみ変更された
部分が実際に再構築されます。あなたのごく小さな例では残念だが、次のようになります。
a_OBJS:= a.o
b_OBJS:= b.o
all: a b
a: $(a_OBJS)
gcc -o[email protected] $^
b: $(b_OBJS)
gcc [email protected] $^
%.o: %.c
gcc -c [email protected] $<
clean:
rm -f *.o
.PHONY: all clean
あなたは自分のビルドに新しい翻訳単位を含めることa_OBJS
とb_OBJS
に複数のオブジェクト・ファイルを追加する必要があります。 パターンルール%.o: %.c
が一致します。発見すべきことがたくさんありますが、GNU make manualで始めることをお勧めします。
これで何が問題なのですか? – dlmeetei
ちょっと冗長になり、より良い方法があるかどうか疑問に思う。 –
それは単に厄介なだけではなく、makeの概念を完全に否定します。単純なシェルスクリプトでも同じことができます。 –