Seite 1 von 1
Nochmal: undefined reference [gelöst]
Verfasst: 2. November 2010 23:49
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
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?

Verfasst: 3. November 2010 01:24
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.
Verfasst: 3. November 2010 08:55
von solarix
da fehlt ein virtueller Destruktor..
hth..
Verfasst: 3. November 2010 08:58
von androphinx
Verfasst: 3. November 2010 09:40
von pfid
solarix hat geschrieben:da fehlt ein virtueller Destruktor..
hth..
Wieso?
Verfasst: 3. November 2010 14:12
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

Lösung!
Verfasst: 5. November 2010 10:38
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!
Übrigens -- wie kann ich hier im Titel einen Thread als gelöst markieren?
Verfasst: 5. November 2010 16:34
von Willi2793
Das erste Posting editieren und dabei den Titel ändern.