Почему макрос Q_OBJECT вызывает проблемы (Qt)? - PullRequest
4 голосов
/ 14 февраля 2012

Я запускаю QtCreator в OSX Lion, и каждый раз, когда я создаю класс, для которого требуется макрос 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 ]

4 голосов
/ 17 мая 2013

Кажется, в Qt Creator все еще есть ошибка.

У меня большой проект, в котором несколько классов имеют Q_OBJECT, а другое количество классов не имеет Q_OBJECT. Работает нормально. Однако, если я добавляю Q_OBJECT в один из классов, у которых его нет, при попытке его собрать я получаю эту ошибку «collect2: ld return 1 exit status».

Проверяя каталог сборки, я вижу, что файл moc для этого класса отсутствует. Qt просто не создает файлы moc для него! Однако, если я удаляю заголовочные файлы и файлы cpp из проекта и добавляю их снова, это работает, файлы moc генерируются и проект создается успешно.

Эта проблема, кажется, возникает, только если у меня есть класс, у которого не было Q_OBJECT, и он был успешно собран в прошлом. Новый класс с Q_OBJECT, который никогда не компилировался перед добавлением «Q_OBJECT», всегда работает нормально.

Итак, если эта проблема возникает, и вы уверены, что все правильно добавили (а комментирование Q_OBJECT позволяет правильно построить проект), сделайте следующее:

  • удалить файлы .h и .cpp (в которые вы только что добавили Q_OBJECT) из проекта.
  • снова добавить их в проект
  • чистый проект
  • построить его снова.

EDIT

В некоторых случаях достаточно запустить qmake (Build / Run qmake), за которым следует Clean All.

0 голосов
/ 14 февраля 2012

файл 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();
}

отлично работает, но должно быть в отдельных файлах

...