2017-08-22 39 views
2

私のディレクトリには2ソースファイルが含まれています。a.cb.cです。私は実行ファイルaa.cbからb.cに生成したいと思います。今私はMakefileを書くための1つの方法しか見つけられません:1つのMakefileに複数の実行可能ファイルを生成するには?

all: 
    gcc -o a a.c 
    gcc -o b b.c 

少し厄介なようですが、より良い方法ですか?私に

+0

これで何が問題なのですか? – dlmeetei

+0

ちょっと冗長になり、より良い方法があるかどうか疑問に思う。 –

+0

それは単に厄介なだけではなく、makeの概念を完全に否定します。単純なシェルスクリプトでも同じことができます。 –

答えて

1

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 

または両方ab

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 

であってもよいです暗黙のここでは、魔法のように支配する。 しかし、ルールにメイクを好むが

+0

'make a'または' make b'が動作しません。 'a'の作成方法は決まっていません。ちょうどそれを試してください:) – uzsolt

+0

私はそれを試してみました。それは魔法の部分です。 'a.c'または' b.c'が存在し、暗黙ルールを実行することを期待してください。この場合メイクファイルは必要ありません – dlmeetei

+0

ああ、私は組み込みのルールを忘れてしまいました。 – uzsolt

2

を指定された私は、次の方法が優れていると思う:

お使いのバージョンで
all: a b 
a: a.c 
    gcc -o a a.c 
b: b.c 
    gcc -o b b.c 

make all常に実行gcc二回、変更されたかどうかa.cb.cます。このバージョンでは、gccは必要なときにのみ実行されます。

もちろん、いくつかの魔法(for -loopなど)を使ってルールを作成することはできますが、私とあなたの方法の違いは明らかです。

makeの基本的な機能は必要に応じて、入力ファイルからの出力ファイルを作成することです:

+2

あなたはマジックを使うことができますが、メイクファイルを使うと、私は通常、シンプルで明示的なものが賢明でわかりにくいと感じています(メイクファイルでは、 '賢い'と '半分の賢い'対称性を強調するので、パターンルール( '%:%.c'と' gcc -o $ @ $ <')はここで正当化されます。 –

1

答えはまだ、私はあなたがどのように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は "偽" であるとabに依存します。 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_OBJSb_OBJSに複数のオブジェクト・ファイルを追加する必要があります。 パターンルール%.o: %.cが一致します。発見すべきことがたくさんありますが、GNU make manualで始めることをお勧めします。

関連する問題