2011-02-16 48 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:修改阻抗不匹配的一種方法(「在C++中,不編譯類,編譯*文件*」)是每個文件只有一個類。這是否是一個好主意取決於你和你的實驗(我想它可能會使編譯速度變慢)。但是,它適用於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)這裏是在你的計劃是矯枉過正的一種方式:

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


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

所以C1.o取決於B.hpp,但C2.o沒有。

3)以下是處理這些依賴關係的更好方法:Advanced Auti-Dependency Generation

+0

首先,我最小的例子似乎是矯枉過正,是的。但由於使用了模板,真實情況要複雜得多。你的例子肯定適用於簡單的情況,但不適合我打算做的事情。編譯和鏈接時,我必須區分類文件和模板文件。我想在定義依賴關係時這麼做,而不是在定義規則時。感謝3)中的提示,我會檢查出來。 – Deve

+0

再次感謝3)中的鏈接,它幫助了我很多! – Deve

相關問題