【问题标题】:Qt and MOC woes with a simple makeQt 和 MOC 的麻烦与一个简单的 make
【发布时间】:2013-06-26 16:27:09
【问题描述】:

我想这更像是一个 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 $@

这很愚蠢,因为$&lt; 是第一个标头,因此所有对象都使用此标头而不是相关标头进行编译。

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

【问题讨论】:

  • 只是出于好奇,您为什么要这样做而不是让qmake 为您构建它?
  • @cmannett85 我必须承认,我没有听说过这个。但是,问题在于 GUI 组件只是使用 gnu make 构建的更大库的一小部分。

标签: qt makefile gnu-make


【解决方案1】:

要从每个$(MOC) 组件生成每个$(MOCS_SOURCES) 组件,您可以使用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 $@

【讨论】:

  • 非常感谢,后面的提示正是我所需要的!
【解决方案2】:

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

%.C : %.h
        $(MOC) $< -o $@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2017-01-30
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多