2011-02-16 11 views
0

他のクラスに依存するクラスをコンパイルするパターンルールを使いたいと思います。各クラスについて、それが依存するクラスとヘッダファイルを定義します。私はこのような前提条件に、すべてのクラスのすべてのヘッダーファイルを追加したいspecifcクラスコンパイルする場合:GNU makeの関数でパターンルールのパターンを使用する

# Class 1 
C1 = C1 
C1_H = C1.hpp 
C1_T = 
C1_O = C1.o 

# Class 2, depending on class 1 
C2 = C2 $(C1) 
C2_H = C2.hpp 
C2_T = 
C2_O = C2.o 

.SECONDEXPANSION: 

# pattern rule. Want to read the C%_H variable of every class this depends on 
C%.o : C%.hpp C%.cpp $(foreach var,$$(C%),$($(var)_H)) 
    $(CC) -o [email protected] -c $< 

を「%」の展開が機能した後に発生したとしてforeachの機能は、ここでは動作しません。拡張。まだこれを行う方法はありますか?

)は、事前に

+0

C++では、_classes_をコンパイルせずに_files_をコンパイルします。 – sbi

+1

gccの-Mオプションを見てください。たとえばhttp://scottmcpeak.com/autodepend/autodepend.htmlを参照してください。 –

+0

@sbi、Deve:インピーダンスミスマッチを修正する方法の1つは、「ファイルをコンパイルするのではなく、クラスをコンパイルしないで、ファイルごとにクラスを1つしか持たない」ことです。これが良いアイデアであろうとなかろうと、それはあなたとあなたの実験(私はそれがいくらか遅くコンパイルするかもしれないと想像しています)までです。しかし、それはJavaのために働きます:) –

答えて

2

1ありがとうここでは)(多かれ少なかれを求めているものを行うための方法です:

C1_HEADERS = C1.hpp 
C1.o: $(C1_HEADERS) 

C2_HEADERS = C2.hpp $(C1_HEADERS) 
C2.o: $(C2_HEADERS) 

# and so on 

とそれらの第二の線(Cn.o: $(Cn_HEADERS))を交換することが可能です関数呼び出しなどがありますが、実際にはそれが価値のあるものだとは思えません。

2)ここで、あなたの計画が行き過ぎである1つの方法があります:

// C1.hpp 
#include "A.hpp" 
... 


// C1.cpp 
#include "C1.hpp" 
#include "B.cpp" 
... 

のでC1.oB.hppに依存するが、C2.oません。

3)これらの依存関係を処理するより良い方法は、Advanced Auti-Dependency Generationです。

+0

まず、私の最小限の例は、残虐行為のようです。しかし、実際のケースは、テンプレートを使用するためにはるかに複雑です。あなたの例は、単純なケースでは確かに動作しますが、私がやろうとしているものではないでしょう。コンパイルとリンク時にクラスファイルとテンプレートファイルを区別する必要があります。私は依存関係を定義するときにそれを行い、ルールを定義するときはしません。 3)のヒントをありがとう、私はそれをチェックします。 – Deve

+0

3)のリンクをもう一度ありがとう、それは私の多くを助けた! – Deve

関連する問題