4 Stimmen

Warum verursacht das Q_OBJECT-Makro Probleme (Qt)?

Ich führe QtCreator in OSX Lion aus und jedes Mal, wenn ich eine Klasse erstelle, die das Q_OBJECT-Makro erfordert, erhalte ich einen Fehler, wenn ich versuche, meine Anwendung zu erstellen. Der Code für diese Klasse ist unten aufgeführt, ebenso wie der Fehler, den ich erhalte. Irgendwelche Hinweise, was los sein könnte?

Hinweis: Ich habe bereits versucht zu reinigen, qmake auszuführen und erneut zu erstellen, ohne Erfolg.

#ifndef TASKLIST_H
#define TASKLIST_H

#include 

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

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

#endif // TASKLIST_H

Und der Fehler:

:-1: Fehler: Symbole wurden für die Architektur x86_64 nicht gefunden

-1: Fehler: collect2: ld hat 1 Exit-Status zurückgegeben

0 Stimmen

@DmitryKachko ja, es ist in einer separaten Datei.

1 Stimmen

Hast du HEADERS += tasklist.h in deiner .pro Datei?

5voto

vsz Punkte 4637

Es scheint immer noch ein Fehler in Qt Creator zu geben.

Ich habe ein großes Projekt mit einer Anzahl von Klassen, die alle Q_OBJECT haben, und einer weiteren Anzahl von Klassen, die kein Q_OBJECT haben. Es funktioniert gut. Wenn ich jedoch Q_OBJECT zu einer der Klassen hinzufüge, die es nicht hatten, erhalte ich den Fehler "collect2: ld returned 1 exit status" beim Versuch, es zu erstellen.

Beim Überprüfen des Build-Verzeichnisses sehe ich, dass die moc-Datei für diese Klasse fehlt. Qt erstellt einfach keine moc-Dateien dafür! Wenn ich jedoch die Header- und cpp-Dateien aus dem Projekt entferne und sie erneut hinzufüge, funktioniert es, die moc-Dateien werden generiert und das Projekt wird erfolgreich erstellt.

Dieses Problem scheint nur aufzutreten, wenn ich eine Klasse habe, die kein Q_OBJECT hatte und in der Vergangenheit erfolgreich kompiliert wurde. Eine neue Klasse mit Q_OBJECT, die noch nie zuvor kompiliert wurde, funktioniert immer einwandfrei.

Also, wenn dieses Problem auftritt und Sie sicher sind, dass Sie alles richtig eingeschlossen haben (und das Kommentieren von Q_OBJECT das Projekt korrekt erstellen lässt), führen Sie folgende Schritte aus:

  • Entfernen Sie die .h- und .cpp-Dateien (in denen Sie gerade das Q_OBJECT hinzugefügt haben) aus dem Projekt.
  • Fügen Sie sie erneut zum Projekt hinzu.
  • Projekt bereinigen
  • Bauen Sie es erneut.

BEARBEITEN

In einigen Fällen reicht es aus, qmake (Build/Run qmake) auszuführen, gefolgt von einem Clean All.

0 Stimmen

Ich hatte genau dieses Problem und habe es behoben, indem ich ein Q_PROPERTY deklariert und neu erstellt habe. Das Q_PROPERTY war nicht einmal syntaktisch korrekt. Merkwürdig.

0voto

Dmitriy Kachko Punkte 2707

Tasklist.h-Datei

   #ifndef TASKLIST_H
    #define TASKLIST_H

    #include 

    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 
#include "tasklist.h"

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

funktioniert gut, aber es sollte in separaten Dateien sein

0 Stimmen

Das gleiche Problem für mich, so hatte ich es eingerichtet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X