2010-07-16 26 views
11

Recibo el siguiente error de vinculador cuando construyo mi aplicación.Q_OBJECT error de enlazador!

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " ([email protected]@@[email protected]@XZ) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" ([email protected]@@[email protected]) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected]) File not found : HIMyClass.obj

Mi declaración de la clase es como

class CHIMyClass:public QDialog 
{ 
    Q_OBJECT 

    .... 

}; 

Cuando comento Q_OBJECT el error de vinculador se apague (y, obviamente, no soy capaz de utilizar señales y ranuras). Estoy usando Qt Creator como IDE y Qt 4.5.3. Cuando doy Rebuild All es definitivo que se llamará QMake. Supongo que es la generación de archivos moc_ * donde reside el problema. Estoy usando Windows XP y cl como el compilador.

¿Cuál es la razón detrás de este error del enlazador?

+0

Quizás 'Archivo no encontrado: HIMyClass.obj' nos dice que Qt Creator no vio archivos moc/obj/temp? – mosg

+1

Realmente, vuelva a ejecutar qmake. Además, verifique si hay caracteres "\" faltantes o adicionales en su archivo .pro. – andref

Respuesta

27

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

+0

El archivo de encabezado correspondiente ya está disponible en la variable HEADERS que todavía enfrenta el problema ... No es la razón ... al menos en mi caso ... :( – liaK

+2

Borre a mano todos los archivos generados por qmake y todos los archivos de objetos, luego vuelva a ejecutar qmake. – chalup

+1

@ chalup, borré todos los archivos MOC, OBJ, RCC y ejecuté qmake, ahora funciona bien. Aunque me alegro de que funcionó, esto es una locura ... ¿Por qué un comportamiento tan indefinido? ¿Alguna adivinación? – liaK

0

Compruebe que las opciones de configuración de Qt necesarios están presentes en el archivo de pro (QT += core gui por lo menos. Proveedores manualmente borrando todo lo construido/creado en el directorio de construcción. A veces sucede que moc falla para funcionar por alguna razón.

también puede intentar ejecutar el comando moc a sí mismo, y ver lo que da salida (se puede encontrar la línea de comandos de la ficha "Compilar salida" en QtCreator

ACTUALIZACIÓN:. thisrelacionados problema parece sugerir que don' t define QT_DLL al compilar. ¿Puedes probar un nuevo y simple proyecto QtCreator? (con un widget que subvierte la ventana principal, por ejemplo) y prueba eso. Debe contener un encabezado Q_OBJECT automáticamente e intentar comparar los archivos .pro y la salida del compilador.

+0

No son los símbolos Qt los que faltan, sino los símbolos generados por moc para su propia clase. Así que preferiría ir con chalup y verificar que el encabezado aparezca en HEADERS. una construcción completamente limpia también podría ayudar. –

+0

Está vinculando bien todas las demás clases que tienen macro [email protected], incluí el archivo en la sección HEADERS e intenté construir limpio más de una vez ... Sin embargo, no tuve suerte ... :( – liaK

1

Compruebe en el archivo MakeFile.debug y tal vez HIMyClass no existe.

Acabo de renombrar MakeFile.debug, limpiar el proyecto y reconstruir todo y compila.

12

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

  1. Construir/Limpiar todo el
  2. Build/Run QMake
  3. Build/Run
+0

Esto lo arregló para mí – ThePosey

+0

qmake es la nota clave;) –

1

que tenía el mismo problema, pero en mi caso no fue suficiente para clean -> build. Así que tuve que eliminar manualmente todos los archivos creados en el proceso de compilación (Mekefiles, ui descriptionns en cpp y, en general, todo el directorio creado por el proceso de compilación) y solo luego compilación exitosa.

0

en mi caja osx esto era debido a la falta de archivos moc *. lo arreglé quitando el bom de mi archivo .pro codificado para utf-8. archivaré un error con qt.

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

"vtable for MainWindow", referenced from:

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

Después de haber escrito este post, hemos revisado

He descubierto que tengo que tocar el archivo .pro antes de la reconstrucción, es decir

  1. Añadir caracteres aleatorios
  2. Guardar
  3. Eliminar caracteres aleatorios
  4. Guardar
  5. generación de proyecto

pasos de 1 - 4 parece invalidar cualquier viejos archivos moc * obligando qmake a reconstruirlas. De lo contrario, un proyecto de reconstrucción parece usar archivos stac moc *.

[EDIT] Respuesta actualizada.

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

0

He encontrado otra posible causa y la solución a este error

también se producirá este error si se ha declarado en la ranura .h archivo, pero no ha definido su cuerpo en la aplicación

0

he tenido este problema . Verificar si hay una descripción de la implementación de la ranura en el archivo .cpp.

0

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

0

Las respuestas de @chalup y @ierax me han ayudado. Tuve que cerrar el creador de Qt y abrirlo nuevamente para qmake surta efecto. Seguí estos pasos: 1. Moví la definición de clase a un archivo de encabezado. 2. Se agregó un archivo de encabezado para proyectar y se aseguró de que aparezca en HEADERS + = \ list en el archivo .pro. 3. Clean-all 4. cerrar QtCreator (en Windows 10) 5. Eliminar Makefiles del directorio de proyectos 6. Abra QtCreator y abra el proyecto. 7. Qmake para asegurar que se generen los archivos make. 8. Rebuild-all

Estos pasos me ayudaron a resolver este problema. Luché durante más de una hora con varias otras respuestas y los métodos no funcionaron. Antes de ejecutar qmake, asegúrese de eliminar los archivos make y cerrar QtCreator (aplicable al menos en Windows 10).

Cuestiones relacionadas