Domanda

sto usando Codice::Blocchi 8.02 e il compilatore mingw 5.1.6.Ricevo questo errore quando compilo il mio progetto Qt:

C: documenti e impostazioni The Fuzz Desktop Gui app_interface.cpp | 33 | Riferimento non definito a "Vtable per indirizzo

File Rubrica.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

File RubricaIndirizzi.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"));
}
È stato utile?

Soluzione

Attenzione: Non fare questo se si dispone già di un file .pro - perderete che

!

Al fine di garantire automaticamente che tutti i file cpp MOC vengono generati, è possibile ottenere qmake per generare automaticamente un file .pro per voi invece di scrivere uno voi stessi.

Esegui

qmake -project

nella directory del progetto, e qmake esplorerà la vostra directory per tutte le intestazioni C ++ e file di origine per generare i file cpp MOC per.

Altri suggerimenti

Quando si utilizza Qt Creator:

  1. Crea → Esegui qmake
  2. Crea → Ricrea tutto

Il problema è quasi certamente che non si compila o no il collegamento nel file moc_AddressBook.cpp generato. (Avrebbe dovuto essere generato per te? - si esegue moc di Qt sul vostro codice prima di compilare, a destra)

Per rispondere a un po 'più a fondo, i segnali macro Q_OBJECT strumento moc di Qt per creare un file di implementazione in più che contiene il codice necessario per supportare il sistema di meta-informazioni di QObject. Se avete avuto segnali o slot, sarebbe fare un paio di cose per quelle pure.

Una soluzione alternativa potrebbe essere quella di rimuovere la macro Q_OBJECT. Probabilmente non si vuole fare questo, ma sarebbe aiutare il problema immediato, e non è strettamente necessario con il codice che avete presentato.

Inoltre, vorrei sottolineare che la linea:

#include "addressbook.h"

dovrebbe probabilmente essere:

#include "AddressBook.h"

in base a come avete presentato i nomi dei file in questione.

Supponendo che si sta utilizzando qmake per generare il Makefile, essere sicuri che AddressBook.h è specificato nella variabile del file .pro di intestazioni, per es.

HEADERS = AddressBook.h

Ho ottenuto questo durante l'utilizzo di funzioni virtuali puri. Ad esempio,

virtual void process();

ha dato questo errore, mentre

virtual void process() = 0;

ha fatto andare via.

Per chi ha Googling questo problema, verificare che tutte le funzioni sono definite virtuali. (Tramite "= 0" o una definizione completa nel file di origine) Sto usando Netbeans con il compilatore MinGW.

Per i progetti CMake, impostare CMAKE_AUTOMOC su ON, questo riparato il mio problema.

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

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

Ho avuto lo stesso problema, ma non appena ho definito il mio costruttore nel file di intestazione invece del cpp l'errore è scomparso. Anche il file corrispondente moc mancava nel file system e nel Makefile sezione "compiler_moc_header_make_all". Ho eseguito un qmake poi finalmente tutto costruito con successo. Sono andato a controllare il Makefile ed è ora c'era.

cancellato la cartella di compilazione, riavviato Qt Creator e ha funzionato

vengo allo stesso problema, ricostruire il progetto non aggiornare il Makefile, tolgo il Makefile e ricostruire, il problema è scomparso. ps:. run 'fare' da linea di comando può dare informazioni di dettaglio rispetto alla IDE, e utile per ottenere il vero problema

Una causa è quando si dichiara una funzioni virtuali in una classe e non si definisce il loro corpo.

Nel mio caso Rigenera tutto non bastasse, ho dovuto cancellare directory di costruzione e fare Rigenera tutto - allora ha funzionato

!

Vai .pro del file e assicurarsi file h ha 'include' prima. TESTATE + = include / file.h \            include / file2.h

Ho avuto lo stesso problema cercando di utilizzare una funzione virtuale protetta.Due cose hanno funzionato.

  1. Mutevole void process(); A void process() = 0;
  2. Fabbricazione process() pubblico invece che privato

Si otterrà lo stesso messaggio di errore se si aggiunge accidentalmente un prototipo distruttore. Aggiungere una definizione di distruttore vuoto o rimuovere il prototipo.

Semplicemente Run qmake per il vostro progetto. Questo può essere fatto facilmente facendo clic destro sul nome del progetto e cliccando sul Run qmake.

File di intestazione per la compilazione moc dovrebbero contenute nelle intestazioni + = ... variabile:

Ho spostato i file di intestazione nella Myproject.pro alle fonti + = ... sezione, perché voglio avere mySource.h e mySource.cpp nello stesso elemento albero. Ma questo è difettosa per Qt Creator. In seguito l'errore "undefined reference to Vtable" si è verificato. Sembra essere: QT rileva intestazione per la compilazione moc solo nelle intestazioni + = ... sezione (o variabile). Si veda anche la spiegazione corretta nel altra risposta StackOverflow Seconda Anwer "I 'Ho visto un sacco di modi per risolvere il problema, ma nessuna spiegazione del perché accade, quindi ecco qui. ". Nella mia mente questo è un esattamente spiegazione del problema, che ha mi aiuta a trovare e risolvere il mio problema.

Sto usando Qt Creator per compilare ed eseguire i miei programmi, io non uso Qt prompt dei comandi spesso. Una cosa che ho fatto per liberarsi del fastidioso errore " vtable qualcosa qualcosa " è aggiungendo le seguenti righe al .pro file.

  

template = app

     

QT + = nucleo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top