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

Posted

技术标签:

【中文标题】如何在 Xcode 中使用 Q_OBJECT 宏编译头文件?【英文标题】:How to compile the header file with Q_OBJECT macro in Xcode? 【发布时间】:2012-07-07 02:28:08 【问题描述】:

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

班级是

MyObject.h

#ifndef MyObject_h
#define MyObject_h

#include <QtCore/QObject>

class MyOBject : public QObject

  Q_OBJECT

public:
    MyOBject();

;


#endif

我的对象.cpp

#include "MyObject.h"

MyOBject::MyOBject()


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

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

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

【问题讨论】:

应该 - 必须。您必须在 C++ 预处理器和编译器之前运行 moc。您的整个帖子可以简化为:“如何在 XCode 中添加 moc 作为构建步骤?”大概如果你遇到这个问题,你将不得不对uicrcc做同样的事情。 【参考方案1】:

这是您在 Xcode 6 中的操作方式:

选择您的目标并在构建规则中创建一个新的自定义规则。 将“进程”下拉菜单设置为“名称匹配的源文件”,然后在旁边输入*.h。 将“使用”下拉菜单设置为“自定义脚本:”,并在脚本中键入与此类似的内容:

/path/to/your/Qt/bin/moc $INPUT_FILE_PATH -o $DERIVED_FILE_DIR/$INPUT_FILE_BASE_moc.cpp

您必须将路径更改为 moc 可执行文件所在的位置。 现在将“输出文件”设置为:

$DERIVED_FILE_DIR/$INPUT_FILE_BASE_moc.cpp

自定义规则就是这样。

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

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

【讨论】:

谢谢。我花了很多时间来理解为什么没有为我生成 moc 文件。结果,我忘记了“编译源”步骤。【参考方案2】:

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

【讨论】:

以上是关于如何在 Xcode 中使用 Q_OBJECT 宏编译头文件?的主要内容,如果未能解决你的问题,请参考以下文章

向 Q_Object 构造函数添加参数

如果在具有 Q_OBJECT 宏的类之外,则无法在 Qt Linguist 中获取字符串

Q_OBJECT 导致“未定义的 v_table 引用”问题

Qt5 在添加 Q_OBJECT 后发现编译出错的原因

急求Q_OBJECT问题

为啥我们只在私人部分给出 Q_OBJECT?