为什么Q_OBJECT宏导致问题(Qt)?

时间:2012-02-14 04:24:02

标签: c++ qt osx-lion

我在OSX Lion中运行QtCreator,每当我创建一个需要Q_OBJECT宏的类时,我在尝试构建应用程序时出错。该类的代码如下,我收到的错误也是如此。可能会发生什么线索?

注意:我已经尝试过清理,运行qmake并重新构建无效。

#ifndef TASKLIST_H
#define TASKLIST_H

#include <QObject>

class TaskList : public QObject
{
    Q_OBJECT
public:
    explicit TaskList(QObject *parent = 0 );

public slots:
    void addTask();
    void displayTasks();
};

#endif // TASKLIST_H

错误:

  

: - 1:错误:找不到架构x86_64

的符号      

: - 1:错误:collect2:ld返回1退出状态

2 个答案:

答案 0 :(得分:4)

Qt Creator似乎还有一个错误。

我有一个大型项目,其中包含许多具有Q_OBJECT的类和另一些没有Q_OBJECT的类。它工作正常。但是,如果我将Q_OBJECT添加到其中一个没有它的类中,那么在尝试构建它时会出现“collect2:ld返回1退出状态”错误。

检查构建目录,我看到缺少此类的moc文件。 Qt只是没有为它创建moc文件!但是,如果我从项目中删除头文件和cpp文件并再次添加它们,它会工作,生成moc文件并成功构建项目。

这个问题似乎只有在我有一个没有Q_OBJECT的类并且它在过去成功构建时才会发生。在添加“Q_OBJECT”之前从未编译过Q_OBJECT的新类总能正常工作。

因此,如果发生此问题并且您确定正确包含所有内容(并且注释掉Q_OBJECT以便正确构建项目),请执行以下操作:

  • 从项目中删除.h和.cpp文件(您刚刚添加了Q_OBJECT)。
  • 再次将它们添加到项目中
  • 清洁项目
  • 再次构建它。

修改

在某些情况下,运行qmake(构建/运行qmake)后跟Clean All就足够了。

答案 1 :(得分:0)

tasklist.h文件

   #ifndef TASKLIST_H
    #define TASKLIST_H

    #include <QObject>

    class TaskList : public QObject
    {
        Q_OBJECT
    public:
        explicit TaskList(QObject *parent = 0 );

    public slots:
        void addTask(){};
        void displayTasks(){};
    };

    #endif // TASKLIST_H

tasklist.cpp

   #include "tasklist.h"

    TaskList::TaskList(QObject *parent) :
        QObject(parent)
    {
    }

的main.cpp

#include <QtCore/QCoreApplication>
#include "tasklist.h"


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    TaskList t;
    return a.exec();
}

工作正常,但它应该在单独的文件中