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:
Q_OBJECT
est présente dans la définition de toutes les classes dérivées de QObject. HEADERS
. 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)