Q_OBJECT error del enlazador!

Recibo el siguiente error de vinculador cuando compilo mi aplicación.

HIMyClass.obj :: error: símbolo externo no resuelto “public: virtual struct QMetaObject const * __thiscall CHIMyClass :: metaObject (void) const” (? MetaObject @ CHIMyClass @@ UBEPBUQMetaObject @@ XZ) Archivo no encontrado: HIMyClass.obj

HIMyClass.obj :: error: símbolo externo no resuelto “public: virtual void * __thiscall CHIMyClass :: qt_metacast (char const *)” (? Qt_metacast @ CHIMyClass @@ UAEPAXPBD @ Z) Archivo no encontrado: HIMyClass.obj

HIMyClass.obj :: error: símbolo externo no resuelto “public: virtual int __thiscall CHIMyClass :: qt_metacall (enumeración QMetaObject :: Call, int, void * *)” (? Qt_metacall @ CHIMyClass @@ UAEHW4Call @ QMetaObject @@ HP Archivo no encontrado: HIMyClass.obj

Mi statement de clase es como

class CHIMyClass:public QDialog { Q_OBJECT .... }; 

Cuando comento Q_OBJECT, el error del enlazador se apaga ( y obviamente no puedo usar señales y ranuras ). Estoy usando Qt Creator como IDE y Qt 4.5.3. Cuando doy Reconstruir todo está claro que se llamará QMake . Supongo que, es la generación de archivos moc_ * donde radica el problema. Estoy usando Windows XP y cl como el comstackdor.

¿Cuál podría ser la razón detrás de este error del enlazador?

Tales errores generalmente significan que no ha agregado el encabezado de su clase a la variable “HEADERS” en el archivo pro (el comstackdor de objetos meta genera archivos moc_ solo para los encabezados listados en esta variable). ¡Recuerde ejecutar qmake después de cambiar el archivo .pro!

Tuve un problema similar y se resolvió utilizando los comentarios de andref. Dentro de QT Creator simplemente:

  1. Construir / limpiar todo
  2. Construir / Ejecutar qmake
  3. Construir / Ejecutar

Desde que escribo este post, lo he revisado.

Descubrí que necesito tocar el archivo .pro antes de reconstruir, es decir,

  1. Añadir caracteres aleatorios
  2. Salvar
  3. Eliminar caracteres aleatorios
  4. Salvar
  5. Proyecto de construcción

Los pasos 1 a 4 parecen invalidar cualquier archivo moc * antiguo que obligue a qmake a reconstruirlos. De lo contrario, un proyecto de reconstrucción parece utilizar archivos moc * obsoletos.

[EDITAR] Respuesta actualizada.

Desde que escribí este post, he estado bastante clean , qmake luego build . El qmake es importante ya que reproduce los archivos moc * que necesita si está cambiando sus archivos .h y cambiando su herencia en contra de Q_OBJECT . De hecho, en algunos casos, incluso puede hacer simplemente qmake luego build para una construcción incremental.

Verifique el archivo MakeFile.debug y tal vez HIMyClass no exista.

Acabo de cambiar el nombre de MakeFile.debug , limpiar el proyecto y reconstruir todo y comstackr.

Tuve el mismo problema, pero en mi caso no fue suficiente para limpiar -> construir. Así que tuve que eliminar manualmente todos los archivos creados en el proceso de comstackción (Mekefiles, ui descriptionns en cpp, y en general todo el directorio creado por el proceso de comstackción) y solo así la comstackción tuvo éxito.

Verifique que las opciones de configuración de Qt necesarias estén presentes en el archivo pro ( QT += core gui al menos. También intente eliminar manualmente todo lo creado / creado en el directorio de comstackción. A veces sucede que moc no se ejecuta por algún motivo.

También puede intentar ejecutar el comando moc usted mismo y ver qué resultados genera (puede encontrar la línea de comandos en la pestaña “Comstackr resultados” en QtCreator.

ACTUALIZACIÓN: este problema relacionado parece sugerir que no define QT_DLL al comstackr. ¿Puedes probar un proyecto nuevo y simple de QtCreator (con un widget que subclasifique mainwindow, por ejemplo) y probar eso? Debe contener un encabezado Q_OBJECT automáticamente e intentar comparar los archivos .pro y la salida del comstackdor.

en mi caja osx esto se debió a la falta de archivos moc *. Arreglé esto eliminando el bom de mi archivo .pro codificado en utf-8. Voy a presentar un error con qt.

error para búsquedas de gafas … NOTA: un vtable faltante generalmente significa que la primera función de miembro virtual no en línea no tiene definición.

“vtable para MainWindow”, referenciado desde:

  MainWindow::MainWindow(QWidget*)in mainwindow.o 

Encontré otra posible causa y solución a este error.

Este error también ocurrirá si uno ha declarado la ranura en el archivo .h pero no ha definido su cuerpo en la implementación

Tuve este problema Verifique si hay una descripción de la implementación de la ranura en el archivo .cpp.

Había eliminado #include "main.moc" de mi archivo principal, y me olvidé de volver a agregarlo … ¡Eso fue una pérdida de tiempo divertida!

Las respuestas de @chalup y @ierax me ayudaron. Tuve que cerrar el creador de Qt y volver a abrirlo para que qmake surta efecto. Seguí estos pasos: 1. Moví la definición de clase a un archivo de encabezado. 2. Se agregó el archivo de encabezado al proyecto y se aseguró de que esté listado contra HEADERS + = \ list en el archivo .pro. 3. Limpiar todo 4. cerrar QtCreator (en Windows 10) 5. Eliminar Makefiles del directorio del proyecto 6. Abrir QtCreator y abrir el proyecto. 7. Qmake para asegurar que se generen los makefiles. 8. Reconstruir todo

Estos pasos me ayudaron a resolver este problema: luché durante más de una hora con otras respuestas y métodos en los que nada funcionó. Antes de ejecutar qmake, asegúrese de eliminar makefiles y cierre QtCreator (aplicable al menos en Windows 10).