Pregunta

Estoy usando :: Blocks 8.02 y el MinGW 5.1.6 compilador. Estoy consiguiendo este error cuando compilo mi proyecto Qt:

  

C: \ Documents and Settings \ El   Fuzz \ Desktop \ GUI \ App_interface.cpp | 33 | indefinido   referencia a `vtable para la libreta de direcciones '

AddressBook.h del archivo:

 #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

AddressBook.cpp del archivo:

#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"));
}
¿Fue útil?

Solución

Advertencia: No haga esto si ya tiene un archivo .pro - usted lo perderá

!

Con el fin de garantizar automáticamente que todos los archivos cpp moc se generan, se puede obtener qmake para generar automáticamente un archivo .pro para usted en vez de escribir uno usted mismo.

Ejecutar

qmake -project

en el directorio del proyecto, y qmake explorará su directorio para todos los encabezados de C ++ y archivos de código fuente para generar archivos cpp moc para.

Otros consejos

Cuando se usa Qt Creator:

  1. Crear → Ejecutar qmake
  2. Crear → Volver a generar todo

El problema es casi seguro que no está compilando o no vincular en el archivo moc_AddressBook.cpp generado. (Debe haber sido generada para usted? - está ejecutando moc de Qt en el código antes de la compilación, derecha)

Para responder a una, las señales macro Q_OBJECT herramienta moc poco más a fondo del Qt para crear un archivo de aplicación adicional que contiene el código necesario para apoyar el sistema de meta-información de QObject. Si usted tuviera cualquier señal o ranuras, sería hacer algunas cosas para esos también.

Una solución alternativa podría ser la de eliminar la macro Q_OBJECT. Es probable que no quiere hacer esto, pero ayudaría el problema inmediato, y no es estrictamente necesario con el código que has presentado.

Además, quiero señalar que su línea:

#include "addressbook.h"

Probablemente debería ser:

#include "AddressBook.h"

función de cómo se presentan los nombres de archivo en la pregunta.

Si se asume que está utilizando qmake para generar su Makefile, asegúrese de que AddressBook.h se especifica en la variable de ENCABEZADOS de su archivo .pro, por ejemplo.

HEADERS = AddressBook.h

Tengo esto durante el uso de funciones virtuales puras. Por ejemplo,

virtual void process();

dio este error, mientras que

virtual void process() = 0;

hizo que desaparezca.

Para cualquier persona que está buscando en Google este problema, compruebe que todas las funciones virtuales se definen. (A través de "= 0" o una definición completa en el archivo de origen) Estoy usando Netbeans con el compilador MinGW.

Para proyectos CRealice, establezca CMAKE_AUTOMOC en ON, esto esté arreglado 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)

Yo tenía el mismo problema, pero tan pronto como he definido mi constructor en el archivo de cabecera en lugar de la .cpp desapareció el error. También el archivo correspondiente moc faltaba en el sistema de archivos y en el Makefile sección "compiler_moc_header_make_all". Me encontré con un qmake, finalmente, todo construido con éxito. Fui a ver el Makefile y fue allí ahora.

eliminado la carpeta de compilación, reiniciado Qt Creator y funcionó

Vengo al mismo problema, vuelva a generar el proyecto nunca actualizar el Makefile, elimino el Makefile y reconstruir, el problema se ha ido. PS:. run 'hacer' desde la línea de comandos que puede dar información de detalle que el IDE, y útil para obtener el problema real

Una de las causas es cuando se declara una función virtual en una clase y no define su cuerpo.

En mi caso Regenerar todo no era suficiente, tenía que eliminar directorio de construcción y hacer volver a generar todo - entonces trabajado

!

Ir a .pro archivo y hacer el archivo .h seguro que tiene 'incluir' antes de ella. CABECERAS + = incluir / file.h \            incluir / file2.h

Yo tenía el mismo problema al intentar utilizar una función virtual protegido. Dos cosas funcionaron.

  1. Cambiar void process(); a void process() = 0;
  2. Hacer pública process() en lugar de privada

Usted recibirá el mismo mensaje de error si accidentalmente se agrega un prototipo destructor. Agregar una definición destructor vacío o eliminar el prototipo.

Simplemente Run qmake para su proyecto. Esto puede hacerse fácilmente con un clic derecho sobre el nombre de su proyecto y hacer clic en Run qmake.

Los archivos de cabecera para la compilación moc deben contenida en las cabeceras + = ... variables:

Me he movido los archivos de cabecera en el Myproject.pro a las fuentes + = ... sección, porque yo quiero tener mySource.h y mySource.cpp en el mismo elemento de árbol. Pero eso es defectuoso para Qt Creator. En consecuencia, el error de "referencia indefinida a VTABLE" se ha producido. Parece ser: QT detecta la cabecera de la compilación moc sólo en el + = ... encabezados de sección (o variable). Véase también la explicación correcta en el otra respuesta stackoverflow Segunda anwer "Yo he visto un montón de maneras de resolver el problema, pero ninguna explicación de por qué sucede, así que aquí va. ". En mi mente esta es una explicación exactamente del problema, que tiene me ayude a fundar y resolver mi problema.

Estoy usando Qt Creator para compilar y ejecutar mis programas, yo no uso Qt símbolo del sistema a menudo. Una cosa que hizo para deshacerse del error molesto " vtable algo algo " es añadiendo las siguientes líneas al archivo .pro.

  

TEMPLATE = aplicación

     

QT + = núcleo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top