Qt 和 MOC 的困境与简单的制作

Nim*_*Nim 3 qt makefile gnu-make

我想这更像是一个 GNU Make 问题,而不是 Qt 和 moc,但这里是。

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

MOCS := $(shell grep -l Q_OBJECT $(HEADERS))
Run Code Online (Sandbox Code Playgroud)

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

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

我的出发点很愚蠢:

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

$(MOC_SOURCES) : $(MOCS)
  @echo "Building Moc: $@ from $<"
  $(MOC) $< -o $@
Run Code Online (Sandbox Code Playgroud)

这是愚蠢的,因为发生的是$<第一个标头,因此所有对象都是使用此标头而不是相关标头来编译的。

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

Dan*_*ité 6

要从每个组件生成$(MOCS_SOURCES)每个$(MOC)组件,您可以使用静态模式规则,如下所示:

$(MOC_SOURCES) : %.C: %.h
    @echo "Building Moc: $@ from $<"
    $(MOC) $< -o $@
Run Code Online (Sandbox Code Playgroud)

另一种常见的做法是使用隐式规则,但对moc. 这是当 qmake 不可用时我使用的方法:

%.moc.o: %.moc.cpp
    $(CXXCOMPILE) $(QT_CPPFLAGS) $(QT_CXXFLAGS) -c $< -o $@

%.moc.cpp: %.h
    $(MOC) $< -o $@
Run Code Online (Sandbox Code Playgroud)