it-swarm.com.de

Nicht definierter Verweis auf vtable. Versuch, ein Qt-Projekt zu kompilieren

Ich benutze Code :: Blocks 8.02 und den mingw 5.1.6 Compiler. Ich erhalte diese Fehlermeldung, wenn ich mein Qt-Projekt kompiliere:

C:\Dokumente und Einstellungen\Die Fuzz\Desktop\GUI\App_interface.cpp | 33 | undefined Verweis auf `vtable for 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"));
}
49
TheFuzz

Warnung: Tun Sie dies nicht, wenn Sie bereits eine .pro-Datei haben - Sie werden sie verlieren!

Um automatisch sicherzustellen, dass alle moc-cpp-Dateien generiert werden, können Sie qmake veranlassen, automatisch eine .pro-Datei für Sie zu generieren, anstatt selbst eine zu schreiben.

Lauf

qmake -project

im Projektverzeichnis und qmake durchsucht Ihr Verzeichnis nach allen C++ - Headern und Quelldateien, um MOC-CPP-Dateien zu erstellen.

43
blwy10

Bei Verwendung von Qt Creator:

  1. Build → Ausführen von qmake
  2. Erstellen → Alles neu erstellen
43
Anurag Verma

Das Problem ist fast sicher, dass Sie die generierte Datei moc_AddressBook.cpp nicht kompilieren oder verknüpfen. (Es sollte für Sie generiert worden sein - Sie führen vor dem Kompilieren die Variable moc von Qt aus, oder?)

Um dies etwas gründlicher zu beantworten, signalisiert das Makro Q_OBJECT das Werkzeug moc von Qt, eine zusätzliche Implementierungsdatei zu erstellen, die den Code enthält, der zur Unterstützung des Metainformationssystems von QObject erforderlich ist. Wenn Sie Signale oder Steckplätze hatten, würde dies auch ein paar Dinge tun.

Eine alternative Lösung könnte darin bestehen, das Makro Q_OBJECT zu entfernen. Sie möchten dies wahrscheinlich nicht tun, aber es würde dem unmittelbaren Problem helfen und ist mit dem von Ihnen vorgelegten Code nicht unbedingt erforderlich.

Ich würde auch bemerken, dass Ihre Zeile:

#include "addressbook.h"

Sollte wahrscheinlich sein:

#include "AddressBook.h"

basierend auf der Darstellung der Dateinamen in der Frage.

15

Angenommen, Sie verwenden qmake, um Ihr Makefile zu generieren. Stellen Sie sicher, dass AddressBook.h in der Variablen der HEADERS-Datei Ihrer .pro-Datei angegeben ist, z.

HEADERS = AddressBook.h
9
Jeremy Friesner

Ich habe dies mit reinen virtuellen Funktionen erhalten. Zum Beispiel gab "Virtual void process ();" Diesen Fehler aus, während "Virtual void process () = 0;" Ließ es verschwinden . Für alle, die googeln Überprüfen Sie dieses Problem zuerst. Ich benutze Netbeans mit dem MinGW-Compiler.

4
Jesse Victors

den Erstellungsordner gelöscht, Qt Creator neu gestartet und es funktionierte

2
yolo

Ich hatte das gleiche Problem, aber sobald ich meinen Konstruktor in der Header-Datei anstelle von .cpp definiert hatte, verschwand der Fehler. Auch die entsprechende Moc-Datei fehlte im Dateisystem und im Makefile-Bereich "compiler_moc_header_make_all". Ich lief ein qmake und baute dann endlich alles mit Erfolg auf. Ich ging zum Makefile und es war jetzt da.

2
yan bellavance

Setzen Sie für CMake-Projekte CMAKE_AUTOMOC auf ON. Dies hat mein Problem behoben.

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

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

Eine Ursache besteht darin, dass Sie virtuelle Funktionen in einer Klasse deklarieren und ihren Körper nicht definieren.

1
agus

In meinem Fall war Rebuild All nicht genug, ich musste das Build-Verzeichnis löschen und Rebuild All erstellen - dann hat es funktioniert!

1
Alexey Petrenko

Ich komme auf das gleiche Problem, rekonstruiere das Projekt nie, aktualisiere das Makefile, entferne das Makefile und rekonstruiere, das Problem ist weg. ps: Wenn Sie 'make' von der Befehlszeile aus ausführen, erhalten Sie möglicherweise detailliertere Informationen als die IDE. Dies ist hilfreich, um das eigentliche Problem zu ermitteln.

1
user281754

Sie erhalten dieselbe Fehlermeldung, wenn Sie versehentlich einen Destruktor-Prototyp hinzufügen. Fügen Sie eine leere Destruktordefinition hinzu oder entfernen Sie den Prototyp.

0
Emil Fors

Ich hatte das gleiche Problem beim Versuch, eine geschützte virtuelle Funktion zu verwenden. Zwei Dinge haben funktioniert.

  1. void process(); in void process() = 0; ändern 
  2. process() öffentlich machen statt privat 
0
khafen

Header-Dateien für die MOC-Kompilierung sollten in der Variablen HEADERS + = ... enthalten sein:

Ich habe die Header-Dateien in der Datei Myproject.pro in den Abschnitt SOURCES + = ... verschoben, weil mySource.h und mySource.cpp im selben Baumelement enthalten sein sollen. Das ist aber fehlerhaft für QT Creator. Im Ergebnis ist der Fehler "Undefinierter Verweis auf vtable" aufgetreten. Es scheint so zu sein: QT erkennt Header für die MOC-Kompilierung nur im Abschnitt HEADERS + = ... (oder in einer Variablen). Siehe auch die richtige Erklärung in andere Stackoverflow-Antwort Second anwer "Ich habe viele Möglichkeiten gesehen, das Problem zu lösen, aber keine Erklärung, warum es passiert." In meinen Augen ist dies eine genaue Erklärung des Problems, die mir geholfen hat, mein Problem zu finden und zu lösen.

0

Gehen Sie zur .pro-Datei und vergewissern Sie sich, dass die .h-Datei 'include' enthält. include/file2.h

0
Phil

Einfach Run qmake für Ihr Projekt. Dies können Sie einfach tun, indem Sie mit der rechten Maustaste auf den Namen Ihres Projekts klicken und auf Run qmake klicken.

0
Sunit Gautam