Erreur de liaison Q_OBJECT : « référence non définie à vtable »
Considérez l'extrait de code Qt suivant :
<code class="cpp">class T : public QObject, public QGraphicsItem
{
Q_OBJECT
public:
T() {}
QRectF boundingRect() const {return QRectF();}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget) {}
};
int main()
{
T t;
return 0;
}</code>
Copier après la connexion
Lors de la compilation de ce code, vous peut rencontrer des erreurs de liaison telles que :
undefined reference to `vtable for T'
undefined reference to `vtable for T'
...
Copier après la connexion
Solution :
Cette erreur se produit généralement lorsque l'unité générée par MOC pour votre classe n'est pas incluse dans le processus de liaison. L'unité MOC contient des méta-informations sur la classe, y compris sa macro Q_OBJECT.
Causes possibles et correctifs :
-
Fichier d'en-tête séparé : Assurez-vous que votre déclaration de classe se trouve dans un fichier d'en-tête distinct. Le système de construction n'analyse peut-être pas les fichiers d'implémentation pour localiser les déclarations de classe.
-
Génération MOC : Vérifiez que l'unité MOC a été générée. Exécutez à nouveau qmake pour forcer qmake à créer les règles MOC nécessaires. Si vous utilisez Qt Creator, sélectionnez « Exécuter qmake » dans le menu contextuel du projet.
-
Macro Q_OBJECT : Confirmez que vous avez correctement utilisé la macro Q_OBJECT dans votre déclaration de classe. Il doit être placé avant toute définition de constructeur.
-
Héritage : Si cette classe n'appartenait pas auparavant au système de méta-objets Qt (par exemple, elle n'avait pas de macro Q_OBJECT ou héritée d'une autre classe ), réexécutez qmake ou apportez des modifications insignifiantes à votre fichier de projet pour déclencher une exécution de qmake.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!