Frage

Ich bin mit Code :: Blocks 8.02 und die mingw 5.1.6 Compiler. Ich erhalte diese Störung, wenn ich mein Qt-Projekt kompilieren:

  

C: \ Dokumente und Einstellungen \ Die   Fuzz \ Desktop \ GUI \ App_interface.cpp | 33 | undefined   Bezugnahme auf `VTable für Addressbook"

Datei AddressBook.h:

 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H

 #include <QWidget>

 class QLabel;
 class QLineEdit;
 class QTextEdit;

 class AddressBook : public QWidget
 {
     Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

 #endif

Datei AddressBook.cpp:

#include <QtGui>
#include "addressbook.h"

AddressBook::AddressBook(QWidget *parent)
     : QWidget(parent)
{
    QLabel *nameLabel = new QLabel(tr("Name:"));
    nameLine = new QLineEdit;

    QLabel *addressLabel = new QLabel(tr("Address:"));
    addressText = new QTextEdit;

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);
    mainLayout->addWidget(nameLine, 0, 1);
    mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget(addressText, 1, 1);

    setLayout(mainLayout);
    setWindowTitle(tr("Simple Address Book"));
}
War es hilfreich?

Lösung

Achtung: dies nicht tun, wenn Sie bereits eine .proDatei haben - Sie können es verlieren werden

Um automatisch sicherstellen, dass alle moc CPP-Dateien generiert werden, können Sie sich qmake, um automatisch eine .proDatei für Sie zu generieren, anstatt selbst eine Beurteilung zu schreiben.

Ausführen

qmake -project

im Projektverzeichnis und qmake wird Ihr Verzeichnis für alle C ++ Header und Quelldateien scannen moc CPP-Dateien zu erzeugen.

Andere Tipps

Bei der Verwendung von Qt Creator:

  1. Erstellen → Ausführen Qmake
  2. Erstellen → Alles neu erstellen

Das Problem ist fast sicher, dass Sie nicht kompilieren oder die Verknüpfung nicht in der generierten moc_AddressBook.cpp Datei. (Es sollte für Sie generiert wurde - Sie Qt moc auf Ihrem Code ausgeführt wird vor dem Kompilieren, rechts)

Um ein wenig gründlicher zu beantworten, die Q_OBJECT Makrosignale Qt moc Tool eine zusätzliche Implementierungsdatei zu erstellen, die den Code Unterstützung QObject Meta-Informationssystem notwendig enthält. Wenn Sie irgendwelche Signale oder Slots hatte, würde es ein paar Dinge für diejenigen tun, auch.

Eine alternative Lösung könnte sein, die Q_OBJECT Makro zu entfernen. Sie wahrscheinlich nicht wollen, dies zu tun, aber es würde das unmittelbare Problem helfen, und es ist nicht unbedingt notwendig, mit dem Code, den Sie vorgelegt haben.

Auch ich möchte darauf hinweisen, dass Ihre Linie:

#include "addressbook.h"

sollte wohl sein:

#include "AddressBook.h"

auf, wie Sie die Dateinamen in der Frage vorgelegt.

Angenommen, Sie qmake verwenden, um Ihre Makefile zu generieren, sicher sein, dass AddressBook.h in Ihrer .pro-Datei des HEADERS der Variablen angegeben wird, z.

HEADERS = AddressBook.h

Ich habe diese während reine virtuelle Funktionen. Zum Beispiel:

virtual void process();

gab diesen Fehler, während

virtual void process() = 0;

machte es weggehen.

Für alle, die dieses Problem ist googeln, ob alle virtuellen Funktionen definiert sind. (Via "= 0" oder eine vollständige Definition in der Quelldatei) Ich benutze Netbeans mit dem MinGW Compiler.

Für CMake Projekte, Satz CMAKE_AUTOMOC auf ON, dies behoben mein Problem.

#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

Ich hatte das gleiche Problem, aber sobald ich meinen Konstruktor definiert in der Headerdatei anstelle des CPP des Fehler verschwunden. Auch die entsprechende moc-Datei wurde in dem Dateisystem fehlt und im Makefile Abschnitt „compiler_moc_header_make_all“. Ich lief ein Qmake dann alles schließlich mit Erfolg gebaut. Ich ging das Makefile zu überprüfen, und es war dort jetzt.

löschte die Build-Ordner neu gestartet Qt Creator und es funktionierte

ich auf das gleiche Problem kommen, wieder aufbauen das Projekt nie das Makefile aktualisieren, ich das Makefile entfernen und neu zu erstellen, das das Problem ist weg. ps:. run ‚make‘ von der Kommandozeile können Sie Detailinformationen als die IDE und hilfreich, um das eigentliche Problem zu bekommen

Eine Ursache ist, wenn Sie eine virtuelle Funktionen in einer Klasse deklarieren und Sie definieren nicht ihren Körper.

In meinem Fall Alles neu erstellen nicht genug war, ich zu löschen Build-Verzeichnis an und macht Alles neu erstellen - dann war es

Zum .proDatei und stellen Sie sicher, .h-Datei hat ‚umfassen‘, bevor es. HEADERS + = include / file.h \            include / file2.h

Ich hatte das gleiche Problem, eine geschützte virtuelle Funktion zu nutzen versuchen. Zwei Dinge gearbeitet.

  1. Ändern void process(); zu void process() = 0;
  2. machen process() Öffentlichkeit statt privat

Sie erhalten die gleiche Fehlermeldung erhalten, wenn Sie versehentlich einen destructor Prototyp hinzuzufügen. Fügen Sie eine leere destructor Definition oder entfernen Sie den Prototyp.

Einfach für Ihr Projekt Run qmake. Dies kann leicht durch einen Rechtsklick auf den Namen des Projekts, und klicken Sie auf Run qmake erfolgen.

Header-Dateien für moc Zusammenstellung sollte in den Headern enthalten + = ... Variable:

Ich habe die Header-Dateien im Myproject.pro zu den Quellen bewegte + = ... Abschnitt, weil ich mySource.h und mySource.cpp im gleichen Baum Element haben will. Aber das ist fehlerhaft für QT Creator. Im Ergebnis hat sich der Fehler „Nicht definiert Bezug auf VTable“ aufgetreten. Es scheint so als: QT-Header für moc Kompilierung erkennt nur in den Headern + = ... Abschnitt (oder Variable). Siehe auch die richtige explaination in der anderen Antwort zweiten Stackoverflow anwer „I habe eine Menge Möglichkeiten gesehen, das Problem zu lösen, aber keine Erklärung dafür, warum es passiert, so hier geht. ". In meinem Kopf ist dies eine genau explaination des Problems, die mir helfen, mein Problem zu gefunden hat und zu lösen.

Ich bin mit Qt Creator meiner Programme kompilieren und ausführen, ich verwende nicht Qt Eingabeaufforderung oft. Eines, was ich tat, um loszuwerden, dem lästigen Fehler „ VTable etwas etwas “ ist, indem die folgenden Zeilen zu .pro Datei.

  

TEMPLATE = app

     

QT + = core

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top