Nochmal: undefined reference [gelöst]

Alles rund um die Programmierung mit Qt
Antworten
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Nochmal: undefined reference [gelöst]

Beitrag von sanni »

In einer eigenen Klasse habe ich nachträglich ein Signal hinzugefügt (und auch das Q_OBJECT):

Code: Alles auswählen

#include <QTableView>

class MyTableView : public QTableView{
  Q_OBJECT
 public:
  MyTableView( QWidget *parent );
 signals:
  dbChanged();
 protected:
  void mouseReleaseEvent( QMouseReleaseEvent *event );
};
Bisher ließ sich alles einwandfrei übersetzen. Nach dem Hinzufügen des Signals bekam ich allerdings die Fehlermeldung des Linkers

Code: Alles auswählen

  undefined reference to 'vtable for MyTableView' 
genau drei Mal. Scheinbar für den Konstruktor, die Methode und den 'emit'-Aufruf des Signals.

Ich habe schon an allen Ecken rumprobiert (in der .pro ist der geforderte Eintrag auch), aber die Lösung finde ich nicht.
Was läuft hier schief? :cry:
Zuletzt geändert von sanni am 6. November 2010 00:39, insgesamt 1-mal geändert.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Das Projekt bereinigen, make clean oder wie das heisst. Dann qmake neu ausführen und dann das Projekt neu compilieren.

Das passiert manchmal. Hab auch schon oft hier im Forum davon gelesen.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

da fehlt ein virtueller Destruktor..

hth..
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

solarix hat geschrieben:da fehlt ein virtueller Destruktor..

hth..
Wieso?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Kurzantwort: das war ein Irrtum.. den in der FAQ beschriebenen Weg reicht.

Langantwort:
Frueher (Sun Compiler um Jahr 2000) erstellte der Compiler die vtable beim (virtuellen) Destruktor (Objektdatei), weil dies die einzige verlaessliche Stelle war (Default-Kontruktor kann fehlen.. aber ein virtueller Destruktor sollte beim Einsatz virtueller Methoden schon vorhanden sein).
Nichts desto trotz: beim gcc laeuft dies 1. anderst (das vtable-Handling haengt vom Compiler ab) und 2. heutzutage auch beim Sun-Compiler (wie ein kurzer Test ergab). Ich habe allerdings keine Ahnung, was genau in der moc_x-Datei den Compiler veranlasst, in der moc_x.o-Objekt-Datei eine vtable zu erstellen (und in anderen Objekt-Dateien nicht..).
Falls jemand weiss wie das funktioniert waere ich an einer Aufloesung interessiert (ich kann die vtable mit "nm *.o" auf Linux nicht mal finden.. auf Solaris gibts ein _classXy_vtbl_-Symbol, der GCC hingegen erstellt nichts aehnliches).

Ach ja: Kurzantwort 2: ein virtueller Destruktor hilft zwar nicht beim besagten Linkerfehler, ist aber trotzdem eine gute Sache :wink:
sanni
Beiträge: 39
Registriert: 27. Mai 2010 11:53

Lösung!

Beitrag von sanni »

Beim Aufräumen bin ich zusätzlich zur Datei 'mytable.cpp' auf eine Datei mit dem Namen 'MyTableView.cpp' gestoßen (oder war es der Header? Ich habe keine Ahnung mehr, da Löschen ging zu schnell!). Das ganze hatte ich zwar schon mal probiert, funktionierte aber nicht.

Nu ist aber alles in Ordnung! :D

Übrigens -- wie kann ich hier im Titel einen Thread als gelöst markieren?
Qt 4.3 auf SuSE 10.3
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Das erste Posting editieren und dabei den Titel ändern.
Antworten