2013-06-26 20 views
2

我想这是一个比Qt和moc更多的GNU制造问题,但是在这里。Qt和MOC的困境与一个简单的制作

我有一个包含多个Q_OBJECTS一个目录,我有一些简单的代码,收集所有这些,如

MOCS := $(shell grep -l Q_OBJECT $(HEADERS)) 

假设HEADERS是头文件中的“当前位置”

集合

现在我想要做的是指定一个规则,它将调用Qt moc来构建.C文件,然后将其编译到一个对象中。如何指定这样的规则?

我的出发点是愚蠢的:

MOC_SOURCES := $(MOCS:%.h=%.C) 
MOC_OBJECTS := $(MOC_SOURCES:%.C=%.o) 

$(MOC_SOURCES) : $(MOCS) 
    @echo "Building Moc: [email protected] from $<" 
    $(MOC) $< -o [email protected] 

这是愚蠢的,因为正在发生的事情是,$<第一头部,所以所有的对象都是使用这个标题,而不是相关的头文件编译。

有没有办法清理这个,以便从正确的头部构建正确的moc对象?

+0

只是出于好奇,你为什么这样做,而不是让'qmake'构建它适合你? – cmannett85

+0

@ cmannett85我必须承认,我没有听说过这个。然而,问题在于GUI组件是一个更大的库的一小部分,它是使用gnu make构建的。 – Nim

回答

1

从每个$(MOC)组件生产各$(MOCS_SOURCES)组件,您可以使用static pattern rule,像这样:

$(MOC_SOURCES) : %.C: %.h 
    @echo "Building Moc: [email protected] from $<" 
    $(MOC) $< -o [email protected] 

另一种常见的做法是使用隐规则,但有一个特定的由moc生成的C++文件的后缀。下面是我用的时候QMAKE是不是一种选择:

%.moc.o: %.moc.cpp 
    $(CXXCOMPILE) $(QT_CPPFLAGS) $(QT_CXXFLAGS) -c $< -o [email protected] 

%.moc.cpp: %.h 
    $(MOC) $< -o [email protected] 
+0

非常感谢,后者的提示正是我所需要的! – Nim

1

我对QT或moc一无所知,但如果你所说的是moc是一个只需要一个头文件并生成一个文件的工具,那么你可以使用一个模式规则:

%.C : %.h 
     $(MOC) $< -o [email protected]