QT, Klasse deklarieren schlägt fehl



  • class AFFE : public QObject
    {
        Q_OBJECT
        public:
           AFFE();
    };
    
    AFFE::AFFE()
    {
    
    }
    

    .obj/main.o: In function AFFE::AFFE[not-in-charge]()': main.cpp:(.text+0x22): undefined reference tovtable for AFFE'
    .obj/main.o: In function AFFE::AFFE[in-charge]()': main.cpp:(.text+0x52): undefined reference tovtable for AFFE'

    Die Meldungen kommen immer nur dann, wenn ich den Konstruktor definiere.



  • hi,

    wie kompilierst du das? hast du qmake oder moc benutzt?



  • Lass mal das Q_OBJECT-Makro weg, schließlich leitest du von dieser Klasse ab.
    Glaube aber nicht das das den Fehler behebt ( wissen kann man es aber nie 😉 )

    Gruß



  • qmake.

    Habs gelöst.

    Die klasse muss in die Dateien *.h und *.cpp zerlegt werden. Es darf also nicht alles in einer Datei stehen.



  • Liegt daran, daß qmake nur .h Dateien surchsucht
    -> Alles, was das Wörtchen Q_OBJECT enthält gehört in .h Dateien
    (Alternativ kann moc selbstredend manuell auf die .cpp angewendet werden)



  • Hallo,ich habe die gleiche Fehlermeldung,nur hat es bei mir nichts gebracht das zu splitten.
    Ich moechte gern das Beispiel aus der Trolltech Hilfe nutzten und bin da auf der Seite http://doc.trolltech.com/4.0/designer-using-a-component.html Die erste Variante habe ich ohne Probleme hinbekommen,doch bei der 2.Variante komme ich halt nicht weiter.Habe also mit dem Qt4 Designer die Form erstellt.Dann noch folgende Datein angelegt:

    imagedialog.h

    #include "ui_imagedialog.h"
    #include <QDialog>
    
    class ImageDialog : public QDialog
        {
            Q_OBJECT
    
        public:
            ImageDialog(QWidget *parent = 0);
    
        private:
            Ui::ImageDialog ui;
        };
    

    imagedialog.cpp

    #include "imagedialog.h"
    #include <QtGui>
    
    ImageDialog::ImageDialog(QWidget *parent)
            : QDialog(parent)
        {
            ui.setupUi(this);
    
            ui.colorDepthCombo->addItem(tr("2 colors (1 bit per pixel)"));
            ui.colorDepthCombo->addItem(tr("4 colors (2 bits per pixel)"));
            ui.colorDepthCombo->addItem(tr("16 colors (4 bits per pixel)"));
            ui.colorDepthCombo->addItem(tr("256 colors (8 bits per pixel)"));
            ui.colorDepthCombo->addItem(tr("65536 colors (16 bits per pixel)"));
            ui.colorDepthCombo->addItem(tr("16 million colors (24 bits per pixel)"));
    
            //connect(ui.okButton, SIGNAL(clicked()), this, SLOT(accept()));
            //connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
        }
    

    main.cpp

    #include "imagedialog.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
        {
            QApplication app(argc, argv);
            QDialog *window = new QDialog;
            Ui::ImageDialog ui;
            ui.setupUi(window);
    
            window->show();
            return app.exec();
        }
    

    und dann noch eine imagedialog.pro

    TEMPLATE    = app
    FORMS       = imagedialog.ui
    SOURCES     = main.cpp imagedialog.cpp
    

    So dann halt qmake und make ausgefuehrt und folgende Fehlermeldung:

    /home/meissner/pro/qt/imageDialog/imagedialog.h:7: undefined reference to `vtable for ImageDialog'
    imagedialog.o(.text+0x44):/home/meissner/pro/qt/imageDialog/imagedialog.h:7: undefined reference to `vtable for ImageDialog'
    imagedialog.o(.text+0x442): In function `ImageDialog::ImageDialog[in-charge](QWidget*)':
    /home/meissner/pro/qt/imageDialog/ui_imagedialog.h:45: undefined reference to `vtable for ImageDialog'
    imagedialog.o(.text+0x44e):/home/meissner/pro/qt/imageDialog/ui_imagedialog.h:45: undefined reference to `vtable for ImageDialog'
    imagedialog.o(.gnu.linkonce.t._ZN11ImageDialog2trEPKcS1_+0x1c): In function `ImageDialog::tr(char const*, char const*)':
    /usr/local/Trolltech/Qt-4.0.0/include/QtCore/arch/qatomic.h:74: undefined reference to `ImageDialog::staticMetaObject'
    

    Was mache ich falsch?



  • Sry seh gerade das ein anderer Thread sich nochmal intensivst mit dem Thema auseinandersetzt,werd mich da erstmal durcharbeiten.

    Bin wohl Tomaten kaufen.



  • Also ich habe jetzt ein paar Stunden damit verbracht eine Loesung zu finden,komme aber nicht weiter.

    Koennte es an diesen moc datein liegen?

    Ich wuerde mich sehr freuen,wenn jemande einen Hinweis fuer mich hat.Danke



  • Werden überhaupt moc-Dateien erstellt?
    WEnn du Q_OBJECT definierst, MÜSSEN die moc-Dateien dabei sein.
    Eventuell hast du aber auch bloß einen Header vergessen.



  • Manchmal klappt das mit den moc-dateien nicht richtig, isnbesondere wenn
    du in .h-Dateien den Q_OBJECT entfernt hast. Dann hilft nur
    alle *.o-Dateien zu löschen und dann kompiliert der g++ nochmal alles
    neu und dann ist der Fehler weg.


Anmelden zum Antworten