2011-12-29 16 views
1

依存関係の順序はメイクファイルの中で重要であると言われています。makeの依存関係の順序

finalObjectFile: x.o main.o y.o 
    g++ x.o main.o y.o -o finalObjectFile 

main.o: header/x.h source/main.cpp 
    g++ -c source/main.cpp 

x.o: header/x.h source/x.cpp 
    g++ -c source/x.cpp 

y.o: source/y.cpp header/x.h 
    g++ -c source/y.cpp 

は、上記のコードでは、私はヘッダファイルx.hの位置を入れ替えています:

x.o: header/x.h source/x.cpp 
     g++ -c source/x.cpp 

y.o: source/y.cpp header/x.h 
     g++ -c source/y.cpp 

が、出力が行われません。私はどのように理解したいです!

実際に依存する重要な依存関係はどれですか?

+0

どこでこれを聞きましたか?私は決してそれに問題がなかった... –

+0

@EricJohnsonこれを参照してください:http://www.eng.hawaii.edu/Tutor/Make/3-3.html –

+2

参照ページの用語は間違っています。それは2001年に書かれました。それは2001年にもウェブから削除されているはずです。または固定。 –

答えて

3

上記の文脈では、ヘッダの前に、のヘッダとのヘッダの前には、大きな違いはありません。です。ルールは、(例えば)言う:

  • x.oheader/x.hsource/x.cppより最近でなければなりません。
これら二つの依存関係がに表示される順序は重要ではありません

。いずれかの依存関係がx.oより新しい場合は、コマンドが実行されます。

注文はいつ問題ですか?これは例示するのがやりにくいですが、途中で複数の中間ファイルが生成される場合は、それが原因になる可能性があります。実行しているコマンドの中には複数のファイルに影響するものの、それらのすべての対話について正しくはmakeを伝えていないと、特に問題になる可能性があります。

ただし、依存関係の順序は通常問題ではありません。

+0

これを見てください:http://www.eng.hawaii.edu/Tutor/Make/3-3.html '依存関係がリストされる順序は重要です。 ' –

+2

これは、トリプルの一部、Anisha - 申し訳ありませんが、それはひどく悪いです。依存関係ではなくターゲットを参照しています。メークファイルにターゲットが表示される順序はわずかですが、 makefileの最初のターゲットは、あなたが望むターゲットを指定せずに 'make'とタイプするときに作られるものなので重要です。従来は、最初のターゲットは「すべて」でした。 'make target1 target2'などのコマンドラインで指定して、任意のターゲットを構築することができます。しかし、ターゲットは依存関係ではありません。それで、そのマニュアルが言ったことを忘れてください - それはすべて間違っていました。 –

+0

啓蒙主義のジョンに感謝します。その結果、依存関係の順序は決して重要ではありませんか?私もターゲットについての質問があります。BTW> –

2

実際のmakeファイルでは、パッケージ化されたルールを使用する傾向があるため、重要です。 原則として、$<は、の最初のに置き換えられます。したがって、

compile = g++ -c $< -o [email protected] 

x.o : source/x.cpp header/x.h 
    $(compile) 

y.o : header/y.h source/y.cpp 
    $(compile) 

最初のルールは、必要に応じてsource/x.cppをコンパイルします。第2の規則 はheader/y.hをコンパイルしようとしますが、これは間違いなく が必要です。

メークファイルを書いた方がはるかに一般的な(合理的な)方法なので、少なくとも 要素が最初に来るように、順序を尊重する必要があります。

別の場合それは問題かもしれない(しかし、うまく 書かれたメイクファイルには当てはまらないはずである):多くの場合、makeは、右の順に左で依存関係 を解決します。すなわち、与えられた:

x.o : source/x.cpp header/x1.h header/x2.h 
    ... 

make最初source/x.cppが最新であることを確認し、必要に応じて を構築し、そのためにheader/x1.hheader/x2.h、 ために同じことをするでしょう。 header/x1.hheader/x2.hより前にビルドする必要のある、特に明記されていない依存関係がある場合は、 の順番を変更することで問題が発生します。ただし、これは メークファイルのエラーです。依存関係を明示的に指定する必要があります(たとえば、 header/x1.h : header/x2.hのルール)。この注文は保証されていないため、それ以外の場合は です。たとえば、GNU makeの場合、 -jオプションを使用すると違反する可能性があります。 header/x.h、注文を交換すると問題が発生する可能性があります。

+0

答えの後半は少し不必要なようです。間違っているわけではありませんが、問題のあるメークファイルの状況について議論する必要はないと思います。自動変数 '$ <'の問題は、私の頭の中に入った最初のものでした。パッケージ化されたルールについてのあなたの言及は少し不必要です。自動変数は、レシピで直接使用することもできます。 – eriktous

+0

@eriktous私は、基本的に注文に明らかな依存関係があるかもしれないという事例を説明しようとしていました。私はこれを処理する正しい方法がmakefileを修正することに同意します。パッケージ化されたルールに関して:自動変数はどのルールでも使用できますが、実際にはパッケージ化されたルール以外は必要ありません。 –

関連する問題