Linkerfehler bei Qt



  • Hallo,

    ich hab ein kleines Problem. Neuerdings hab ich mal mit Qt angefangen, hab mir auch die Doku angeguckt (und die Einsteiger-'Tutorials').
    Was bei mir nicht funzt, ist dieser Code:

    #include <QtGui>
    
    class Editor: public QObject
    {
    	Q_OBJECT
    
    public:
    
    	Editor():
    	quitButton(tr("Quit")),clearButton(tr("Clear")){
    
    		layout.addWidget(&Edit);
    		layout.addWidget(&quitButton);
    		layout.addWidget(&clearButton);
    		QObject::connect(&quitButton, SIGNAL(clicked()), this, SLOT(quit()));
    		QObject::connect(&clearButton, SIGNAL(clicked()), this, SLOT(clear()));
    	}
    
    	~Editor(){}
    
    	QVBoxLayout* get_lay(){return &layout;}
    
    	public slots:
    
    	inline void quit(){exit(0);}
    	void clear(){Edit.clear();}
    
    	signals:
    	private:
    
    	QTextEdit Edit;
    	QPushButton quitButton;
    	QPushButton clearButton;
    	QVBoxLayout layout;
    };
    
    int main(int argv, char **args)
    {
    	QApplication app(argv, args);
    
    	Editor edit;
    
    	QWidget window;
    
    	window.setLayout(edit.get_lay());
    
    	window.show();
    
    	return app.exec();
    }
    

    Folgende Linkerfehler kommen da bei mir rein:

    obj\Debug\main.o||In function `~Editor':|
    D:\C(++) Saves\Qt Applications\Test\main.cpp|19|undefined reference to `vtable for Editor'|
    D:\C(++) Saves\Qt Applications\Test\main.cpp|49|undefined reference to `vtable for Editor'|
    obj\Debug\main.o||In function `Editor':|
    D:\C(++) Saves\Qt Applications\Test\main.cpp|10|undefined reference to `vtable for Editor'|
    obj\Debug\main.o||In function `ZN6Editor2trEPKcS1_':|
    D:\C(++) Saves\Qt Applications\Test\main.cpp|5|undefined reference to `Editor::staticMetaObject'|
    D:\C(++) Saves\Qt Applications\Test\main.cpp|5|undefined reference to `Editor::staticMetaObject'|
    

    Ich hab schon ein wenig im Netz gesucht, allerdings trifft wenig auf mein Problem zu...

    Ich benutz CodeBlocks 10.5, das oben ist ein 'Qt' Projekt. Ich arbeite mit MinGW (4.4.1).

    Vorher funktionierten schon ein paar Beispiele. Bei dieser eigenen Klasse aber streikt der Compiler. warum ?

    Wär nett' wenn jemand helfen könnte. 😃



  • P.S.: Ich benutz Qt version 4.7.7 .



  • Deine Klasse "Editor" muss in eine Header Datei. Diese Header Datei muss dann in der *.pro Datei eingefügt werden. Dann qmake erneut ausführen und dann neu erstellen. Dann sollte der Fehler behoben sein. QObject's müssen durch den "moc".



  • ScyllaIllciz schrieb:

    QObject's müssen durch den "moc".

    Nö. (Ich könnte jetzt hier ganz provokativ aufhören :D)

    Durch den moc müssen Header nur, wenn in ihnen Klassen mit Q_OBJECT in der Klassendefinition stehen.



  • In meiner Klasse steht doch 'Q_OBJECT',...



  • Übrigens hab ich mal nen anderen Quellcode genommen, selber fehler, aber wenn ich dann 'Q_OBJECT' weglasse funktioniert es fehlerfrei (!), ist vielleicht bei der anderen Klasse genauso ...



  • Nö. (Ich könnte jetzt hier ganz provokativ aufhören :D)

    Ich weiss zwar nicht was das soll aber naja.

    @Flockzone
    Die Version 4.7.7 kenne ich (noch ;-)) nicht. Aber wenn Du das "Q_OBJECT" Makro in einer Klasse verwendest, muss diese Deklaration in einer Header Datei stehen und im pro File angegeben werden. Weiterhin muss diese Klasse auch von QObject erben und qmake aufgerufen werden. Entweder direkt oder indirekt durch Ableiten einer anderen Klasse z.B. QDialog/QMainWindow.



  • ScyllaIllciz schrieb:

    Nö. (Ich könnte jetzt hier ganz provokativ aufhören :D)

    Ich weiss zwar nicht was das soll aber naja.

    Dann schreib ich das nächste mal nur hin "falsch" und du kannst dich darüber aufregen.
    Ich will sagen:
    Nur weil eine Klasse von QObject erbt, muss der entsprechende Header nicht durch den moc. Erst mit einem Q_OBJECT-Macro wird das notwendig, da Q_OBJECT einige Methoden deklariert, die durch den moc dann implementiert werden (vorausgesetzt, es wird dem moc nicht "-E" mitgegeben).

    Ansonsten hast du recht mit dem, was du über den Fehler des OP sagst: Hier MUSS der Header durch den moc (Q_OBJECT muss in die Definition, da die Klasse selber SLOTS anbietet), im .pro-File unter HEADERS angeben, qmake nochmal laufen lassen (evtl. make clean vorher), dann kompiliert (bzw. linkt) das auch.



  • Hi,
    ich denke, das ist der altbekannte Fehler.
    Schonmal versucht, vor dem Builden zu cleanen, qmake laufen zu lassen, und dann von Grund auf neu zu builden?

    Was es auch sein könnte: Versuche mal, QObject direkt zu linken.

    Und es macht keinen Sinn, das komplette QtGui paket zu linken.
    Das macht dein Programm nur unsinnig groß und langsam.

    mfg Matogel


Anmelden zum Antworten