Referencia no definida a vtable. Intentando comstackr un proyecto de Qt

Estoy usando Code :: Blocks 8.02 y el comstackdor mingw 5.1.6. Recibo este error cuando compilo mi proyecto de Qt:

C: \ Documents and Settings \ The Fuzz \ Desktop \ GUI \ App_interface.cpp | 33 | referencia indefinida a `vtable para AddressBook ‘

Archivo AddressBook.h:

#ifndef ADDRESSBOOK_H #define ADDRESSBOOK_H #include  class QLabel; class QLineEdit; class QTextEdit; class AddressBook : public QWidget { Q_OBJECT public: AddressBook(QWidget *parent = 0); private: QLineEdit *nameLine; QTextEdit *addressText; }; #endif 

Archivo AddressBook.cpp:

 #include  #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")); } 

Advertencia: ¡No haga esto si ya tiene un archivo .pro, lo perderá!

Para garantizar automáticamente que se generen todos los archivos moc cpp, puede obtener qmake para generar automáticamente un archivo .pro en lugar de uno.

correr

 qmake -project 

en el directorio del proyecto, y qmake escaneará tu directorio en busca de todos los encabezados C ++ y archivos fuente para generar archivos moc cpp.

Al usar Qt Creator:

  1. Build → Ejecutar qmake
  2. Build → Rebuild All

El problema es casi seguro que no está comstackndo o no está enlazando en el archivo moc_AddressBook.cpp generado. (Debería haberse generado para usted; está ejecutando el moc de Qt en su código antes de comstackr, ¿no?)

Para responder un poco más a fondo, la macro Q_OBJECT señala la herramienta Q_OBJECT Qt para crear un archivo de implementación adicional que contiene el código necesario para admitir el sistema de metainformación de QObject . Si tuviera alguna señal o ranura, también haría algunas cosas para ellos.

Una solución alternativa podría ser eliminar la macro Q_OBJECT . Probablemente no quiera hacer esto, pero ayudaría al problema inmediato, y no es estrictamente necesario con el código que ha presentado.

Además, me gustaría señalar que su línea:

 #include "addressbook.h" 

Probablemente debería ser:

 #include "AddressBook.h" 

según cómo presentaste los nombres de archivo en la pregunta.

Asumiendo que está usando qmake para generar su Makefile, asegúrese de que AddressBook.h esté especificado en la variable HEADERS de su archivo .pro, por ejemplo

 HEADERS = AddressBook.h 

Lo obtuve usando funciones virtuales puras. Por ejemplo, “virtual void process ();” dio este error, mientras que “virtual void process () = 0;” lo hizo desaparecer Para cualquiera que esté buscando en Google este problema, verifique eso primero. Estoy usando Netbeans con el comstackdor MinGW.

Tuve el mismo problema, pero tan pronto como definí mi constructor en el archivo de encabezado en lugar de .cpp, el error desapareció. También faltaba el archivo moc correspondiente en el sistema de archivos y en la sección Makefile “compiler_moc_header_make_all”. Ejecuté un qmake y finalmente todo construido con éxito. Fui a ver el Makefile y estaba allí ahora.

eliminó la carpeta de comstackción, reinició Qt Creator y funcionó

Llego al mismo problema, reconstruyo el proyecto, nunca actualizo el Makefile, elimino el Makefile y lo reconstruyo, el problema se ha ido. ps: ejecutar ‘make’ desde la línea de comandos puede proporcionarle información detallada que el IDE, y es útil para obtener el problema real.

Una de las causas es cuando declaras funciones virtuales en una clase y no defines su cuerpo.

En mi caso Rebuild All no fue suficiente, tuve que eliminar el directorio de comstackción y hacer Rebuild All, ¡y luego funcionó!

Para los proyectos de CMake, configure CMAKE_AUTOMOC en ON, esto solucionó mi 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) 

Vaya al archivo .pro y asegúrese de que el archivo .h tenga ‘incluir’ antes. HEADERS + = include / file.h \ include / file2.h

Tuve el mismo problema al intentar usar una función virtual protegida. Dos cosas funcionaron.

  1. Cambiando el void process(); void process() = 0;
  2. Making process() público en lugar de privado

Obtendrá el mismo mensaje de error si accidentalmente agrega un prototipo de destructor. Agregue una definición de destructor vacío o elimine el prototipo.

Estoy usando Qt Creator para comstackr y ejecutar mis progtwigs, no uso Qt command prompt a menudo. Una cosa que hice para deshacerme del molesto error ” vtable something something ” es agregar las siguientes líneas al archivo .pro .

TEMPLATE = aplicación

QT + = núcleo