我想这更像是一个GNU Make问题,而不是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: $@ from $<"
$(MOC) $< -o $@
这很愚蠢,因为发生的事情是$<
第一个标题,因此所有对象都是使用此标题而不是相关标题编译的。
有没有办法清理它,以便从正确的标头构建正确的moc对象?
答案 0 :(得分:1)
我对QT或moc一无所知,但如果您所说的是moc是一个采用单个头文件并生成单个.C
文件的工具,那么您可以使用模式规则:
%.C : %.h
$(MOC) $< -o $@
答案 1 :(得分:1)
要从每个$(MOCS_SOURCES)
组件生成每个$(MOC)
组件,您可以使用static pattern rule,如下所示:
$(MOC_SOURCES) : %.C: %.h
@echo "Building Moc: $@ from $<"
$(MOC) $< -o $@
另一种常见做法是使用隐式规则,但使用moc
生成的C ++文件的特定后缀。这是我在qmake不是一个选项时使用的:
%.moc.o: %.moc.cpp
$(CXXCOMPILE) $(QT_CPPFLAGS) $(QT_CXXFLAGS) -c $< -o $@
%.moc.cpp: %.h
$(MOC) $< -o $@