2011-02-16 49 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

相关问题