moc: 未知选项 -isystem

moc: Unknown option -isystem

我正在尝试安装 score-p。它有标准的构建链。我成功通过了配置部分。 Makefile 是配置后自动生成的。然后我做了 make 并得到了一个错误。问题是 moc 抱怨 -isystem 是一个未知选项。该选项嵌入在 QT_CPPFLAGS 中。如果我删除这个选项,那么 moc 会抱怨指定了太多的输入文件。我该怎么办?

$(editor_plugin_moc_o): ../src/GUI-qt/plugins/SourceCodeEditor/%.moc.cpp: $(SRC_ROOT)src/GUI-qt/plugins/SourceCodeEditor/%.h
    @echo "Create moc file $@"
    @$(MKDIR_P) ../src/GUI-qt/plugins/SourceCodeEditor
    @$(MOC) $(QT_CPPFLAGS) $(CUBE_INCLUDES) $(GUI_INCLUDES) $(CUBE_DEBUG_FLAGS) $(DEFINE_TRACE_BROWSER) $< -o $@

你的依赖结构有点不对:

你想要这样的东西:

%.o : %.moc.cpp %.cpp
    @echo "Normal compilation of object file goes here"

%.moc.cpp: %.cpp
    moc $(INCLUDES) $(DEFINES) -i $< -o $@

请注意 moc.cpp 文件和源 cpp 文件链到同一个目标文件(因为 moc.cpp 实际上是主 cpp 的附加源代码您让 moc 为您生成的文件)。另请注意,您需要有一个规则来实际生成 moc.cpp 文件,您在其中传递 moc 正确的定义和包含。最后:你不传递 moc 之类的东西 -isystem 或其他编译器特定的标志,只是定义和包含。

请参阅文档,其中包含关于 moc 和 Makefile 的完整部分:http://doc.qt.io/qt-5/moc.html

GCC -isystem 选项带有一个参数,因此它类似于 -isystem /some/dir/include。您不能只删除 -isystem 选项而不删除其参数。

但是,如果您同时删除它们,您可能会遇到编译错误,因为找不到头文件。

我建议你尝试把-isystem选项变成一个普通的-I选项,moc会明白:

@$(MOC) $(patsubst -isystem,-I,$(QT_CPPFLAGS)) $(CUBE_INCLUDES) $(GUI_INCLUDES) $(CUBE_DEBUG_FLAGS) $(DEFINE_TRACE_BROWSER) $< -o $@