Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que je reçois une \"Erreur de liaison Q_OBJECT : \'référence non définie à vtable\'\" dans mon application Qt ?

Pourquoi est-ce que je reçois une \"Erreur de liaison Q_OBJECT : \'référence non définie à vtable\'\" dans mon application Qt ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 03:51:02241parcourir

 Why Am I Getting a

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>

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'
...

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn