c++ - gui - qt license
Qt y ningĂșn archivo moc_*. Cpp (6)
Estoy desarrollando una aplicación Qt 4 simple y haciendo mi propio diálogo. QDialog
, Q_OBJECT
macro Q_OBJECT
en el bloque de declaración de clase, y ... Obtengo
[Error de enlazador] referencia indefinida a `vtable para MyDialog ''y no hay moc_MyDialog.cpp generado por el compilador de moc.
Estoy usando Qt 4.1.3 en Windows XP y mingw. Seguí el proceso de compilación desde el shell de compilación provisto por Qt. Usé qmake para crear archivos make y compilé todo con un comando make.
Tengo otras clases que subclasifican QPushButton
y QObject
respectivamente, pero compilan OK. No puedo encontrar ninguna diferencia entre ellos y el roto.
Debe faltar algo en la clase rota, pero no puedo encontrarlo.
¿Estás usando qmake? Quizás no lo haya agregado a su archivo .cpp a su archivo SOURCES y .h a su variable HEADERS en el archivo qmake?
He visto que el problema aparece solo cuando se agrega una clase sin extensión y luego se agrega una extensión manualmente.
Para resolver el problema puse Q_OBJECT en el .h de la clase y luego hago clic derecho en "Fuentes" -> "Agregar archivos existentes ..." seleccionando el .ccp de mi clase modificada.
Humildemente sugiero que uses CMake para construir programas Qt en Windows. Te mantendrá recordando agregar archivos apropiados a sus archivos de compilación.
El valor adicional es que puede generar archivos make / nmake de él, archivos de solución de Visual Studio. Y si compila Qt desde la fuente para Visual Studio, podrá codificar y compilar con MS IDE / compiler.
Esto es por supuesto si estás usando Visual Studio en absoluto.
La referencia indefinida a "vtable para MyDialog" se debe a que no hay ningún archivo moc. La mayoría de los compiladores de c ++ crean la definición de vtable en el archivo de objeto que contiene la primera función virtual. Cuando se subclasifica un objeto qt y se utiliza la macro Q_OBJECT, estará en el archivo moc * .cpp. Por lo tanto, este error significa que falta el archivo moc.
Los posibles problemas que puedo pensar son:
El archivo de encabezado para la clase MyDialog.h no se agrega a HEADERS en el archivo qmake.
Ejecutó qmake para generar el archivo make antes de agregar la macro Q_OBJECT. Esto creó un archivo make sin las reglas moc. Esto se soluciona fácilmente simplemente ejecutando qmake nuevamente.
Su diálogo deriva de más de una clase y QDialog no es la primera clase de la que proviene. Para que qmake funcione correctamente, la clase base derivada de QObject debe ser la primera clase heredada.
Si está utilizando Qt Creator, puede obtener este error si su implementación anterior falló debido a alguna razón (como la aplicación que ya se está ejecutando). En ese caso, simplemente haga un ''Proyecto limpio'' y luego ''Reconstruir proyecto'' y luego ''Ejecutar'' para implementar.
La referencia indefinida de mensaje a `vtable para MyDialog ''también puede ser el resultado de una implementación faltante (en MyDialog) de una función virtual pura en una clase derivada de MyDialog.
Si tiene incluido su archivo de encabezado, siga los pasos:
- Haga clic derecho en el proyecto donde lo ha agregado.
- Pulse ''Ejecutar qmake''.
Esto borrará las referencias antiguas y se compilará con la macro Q_OBJECT. QT no lo hace en la reconstrucción.