如何在Xcode中使用Q_OBJECT宏编译头文件?

如何在Xcode中使用Q_OBJECT宏编译头文件?,xcode,qt,qobject,moc,Xcode,Qt,Qobject,Moc,我在XCODEL中创建了C++项目,它与QT框架相链接。hello world程序运行良好。当我添加从QObject派生的类并添加Q_objset宏时,会出现链接错误 这个班是 MyObject.h #ifndef MyObject_h #define MyObject_h #include <QtCore/QObject> class MyOBject : public QObject { Q_OBJECT public: MyOBject(); }; #e

我在XCODEL中创建了C++项目,它与QT框架相链接。hello world程序运行良好。当我添加从QObject派生的类并添加Q_objset宏时,会出现链接错误

这个班是

MyObject.h

#ifndef MyObject_h
#define MyObject_h

#include <QtCore/QObject>

class MyOBject : public QObject
{
  Q_OBJECT

public:
    MyOBject();

};


#endif
我知道我应该首先使用moc编译MyObject.h,并将生成的moc_MyObject.cpp添加到Xcode项目中

在Microsoft Visual Studio中,我可以将此头文件配置为使用moc自定义工具编译。并将生成cpp文件添加到VS项目中


但这是Xcode。我的问题是:在Xcode中是否存在编译包含Q_OBJECT宏的头文件的等效方法?

我没有找到如何在Xcode中为特定头文件设置自定义工具。我通过构建阶段脚本(构建阶段->添加构建阶段->添加运行脚本)找到了一个解决方法。我将moc命令行添加为脚本,并将生成的moc_MyObject.cpp文件包含到MyObject.cpp中。它现在可以工作了。

以下是您在Xcode 6中的工作方式:

选择目标并在生成规则中创建新的自定义规则。 将“进程”下拉列表设置为“名称匹配的源文件”,并在其旁边键入
*.h
。 将“使用”下拉列表设置为“自定义脚本:”并在脚本中键入与此相近的内容:

/path/to/your/Qt/bin/moc ${INPUT_FILE_PATH} -o ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}_moc.cpp
您必须更改moc可执行文件所在位置的路径。 现在将“输出文件”设置为:

这就是自定义规则

现在获取要使用此规则编译的头。当您的目标仍然处于选中状态时,转到“构建阶段”。展开“编译源代码”部分,点击底部的“+”按钮。查找并添加包含Q_对象类的头文件。如果在项目中找不到这些标题,请首先将它们添加到项目中


就是这样,Xcode将在这些头上运行moc,它将了解moc的输出是一个.cpp,需要编译并链接到您的应用程序中,并为您执行此操作。

不应该-必须。在C++预处理器和编译器之前,必须运行<代码> MOC < /代码>。您的整个帖子可以简化为:“我如何在XCode中添加moc作为构建步骤?”假设您遇到了这个问题,您将不得不对
uic
rcc
执行同样的操作。谢谢。我花了很多时间来理解为什么没有为我生成moc文件。结果,我忘记了“编译源代码”步骤。
/path/to/your/Qt/bin/moc ${INPUT_FILE_PATH} -o ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}_moc.cpp
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}_moc.cpp