Q_OBJECT-Verknüpfungsfehler: 'undefinierter Verweis auf vtable'
Berücksichtigen Sie den folgenden Qt-Codeausschnitt:
<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>
Beim Kompilieren dieses Codes haben Sie Es können Linker-Fehler auftreten wie:
undefined reference to `vtable for T'
undefined reference to `vtable for T'
...
Lösung:
Dieser Fehler tritt normalerweise auf, wenn die MOC-generierte Einheit für Ihre Klasse nicht im Verknüpfungsprozess enthalten ist. Die MOC-Einheit enthält Metainformationen über die Klasse, einschließlich ihres Q_OBJECT-Makros.
Mögliche Ursachen und Lösungen:
-
Separate Header-Datei: Stellen Sie sicher, dass sich Ihre Klassendeklaration in einer separaten Header-Datei befindet. Das Build-System durchsucht möglicherweise keine Implementierungsdateien, um Klassendeklarationen zu finden.
-
MOC-Generierung: Stellen Sie sicher, dass die MOC-Einheit generiert wurde. Führen Sie qmake erneut aus, um qmake zu zwingen, die erforderlichen MOC-Regeln zu erstellen. Wenn Sie Qt Creator verwenden, wählen Sie „Qmake ausführen“ aus dem Projektkontextmenü.
-
Q_OBJECT-Makro: Bestätigen Sie, dass Sie das Q_OBJECT-Makro in Ihrer Klassendeklaration ordnungsgemäß verwendet haben. Es sollte vor allen Konstruktordefinitionen platziert werden.
-
Vererbung: Wenn diese Klasse zuvor nicht zum Qt-Metaobjektsystem gehörte (z. B. hatte sie kein Q_OBJECT-Makro oder wurde von einer anderen Klasse geerbt). ), führen Sie qmake erneut aus oder nehmen Sie geringfügige Änderungen an Ihrer Projektdatei vor, um einen qmake-Lauf auszulösen.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich in meiner Qt-Anwendung einen „Q_OBJECT-Verknüpfungsfehler: „undefinierter Verweis auf vtable''?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn