Référence non définie à `vtable

Je crée une application graphique en utilisant Qt; J’essaie de faire hello world utilisant Qt et cela fonctionne parfaitement, mais lorsque je crée un widget de liste personnalisé, ma undefined reference to vtable erreur undefined reference to vtable est undefined reference to vtable lorsque je le comstack:

J’utilise éclipse et c ++

 #ifndef QMENUFILTER_H_ #define QMENUFILTER_H_ #include  class CustomMenuFilter : QMenu { Q_OBJECT public: CustomMenuFilter () ; ~CustomMenuFilter() ; private: QMenu FilterMenu; QAction *AddFilterAct ; QAction *DeleteFilterAct ; Q_SLOT void contextMenuEvent(QContextMenuEvent *event); }; #endif /* QMENUFILTER_H_ */ #include "QMenuFilter.h" CustomMenuFilter::CustomMenuFilter():QMenu() { DeleteFilterAct = new QAction("DeleteFilter" , this); AddFilterAct = new QAction("AddFilter" , this); AddFilterAct->setText("AddFilter"); DeleteFilterAct->setText("DeleteFilter"); } 

Fichier LOG: http://pastebin.com/raw.php?i=qZes6bkm

Vous devez également définir le dtor, ce qui créera le vtable

 CustomMenuFilter::~CustomMenuFilter() { ... } 

Bien que certaines règles (dépendantes du compilateur) décrivent le moment exact où le compilateur émet une vtable, il n’est généralement pas important que vous le sachiez. L’important est que vous deviez définir le dtor et que le compilateur se charge de la vtable. Si vous voyez l’erreur “référence indéfinie à la vtable”, vérifiez toujours le dtor.

Plusieurs compilateurs émettent dans la TU la vtable qui définit la première définition hors ligne d’un virtuel – implicitement, c’est votre destructeur dans ce cas (car le destructeur de QMenu est probablement virtuel).

Donc, append la définition de votre destructeur devrait résoudre le problème.

 // CustomMenuFilter.cpp CustomMenuFilter::~CustomMenuFilter() {} 

D’après les faits #qt, lors de l’obtention d’une erreur vtable sur une classe dérivée de QObject:

  1. Assurez-vous que la macro Q_OBJECT est présente dans la définition de toutes les classes dérivées de QObject.
  2. Assurez-vous de déclarer UNIQUEMENT vos classes dérivées de QObject dans vos fichiers d’en-tête.
  3. Assurez-vous que tous vos fichiers d’en-tête sont répertoriés dans votre fichier .pro dans la liste HEADERS .
  4. Exécutez qmake chaque fois que vous ajoutez Q_OBJECT à l’une de vos classes ou modifiez votre fichier .pro.

Je ne vois pas la sortie de moc liée dans l’exécutable final dans votre journal de construction:

g ++ -L / usr / local / lib / -lQtGui -lQtCore -o “CameraManagerAfterBeta” ./trunk/Source/Camera.o ./trunk/Source/Interface.o. /trunk/Source/Manager.o ./trunk/ Source / QMenuFilter.o ./trunk/Source/main.o -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc

Aucun moc_QMenuFilter.o n’est lié. C’est l’erreur . Il est probable que vous ayez ajouté la macro Q_OBJECT et oublié de réexécuter qmake (ou que vous Q_OBJECT même pas ajouté l’en-tête dans la liste HEADERS du fichier .pro).

Définissez CMAKE_AUTOMOC sur ON, mon problème a été résolu.

 #Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON)