c++ - ¿Por qué es importante incluir el archivo ".moc" al final de un archivo de código fuente Qt?
introspection (1)
Es necesario si define las subclases de
QObject
con la macro
Q_OBJECT
en un archivo
.cpp
.
Cuando lo hagas:
-
qmakedebe generar reglas dentro de suMakefilepara invocarmocen ese archivo.cpp.Esa inclusión especial (¿hackish?) Activa
qmakepara hacerlo, y le dice cuál sería el archivo de salida deteststring.moc(teststring.moc) cuando se invoca en su.cpp. -
Para compilar la salida de
moc(que todavía es un montón de código C ++) el compilador debe ver su definición de clase. De lo contrario, se quejará de que no existeYourClass::staticMetaObjecty similares, porque no tiene idea de queYourClassexiste.Por lo general, uno define clases con
Q_OBJECTen un archivo de encabezado.mocluego agrega un#include "header.h"en su salida generada, y esto significa que la salida de#include "header.h"puede compilarse felizmente.Pero, ¿qué pasa si la definición de su clase está dentro de un
.cpp? No puede.cppun archivo.cppen la salida de.cpp, ya que eso le daría toneladas de errores de redefinición.En cambio,
.cppsalida de.cppen su.cpp, para que se compile y todos.cppcontentos. (Esto significa queqmakesolo emitirá una regla que dice que ejecutemoc, pero no otra regla que le indique al compilador que compile la salida democ).
Desde 2. también puede suponer que definir clases con
Q_OBJECT
en un
.h
no requiere ninguna inclusión especial.
¿Por qué es importante agregar una inclusión para el archivo .moc en un código fuente Qt cpp?
Este es un paso común utilizado en varias muestras de Qt, incluido este: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html ; donde la línea #include "testqstring.moc" debe incluirse al final del archivo.
No entiendo exactamente por qué esto es necesario.
Gracias.