Fehler beim Linken von neuem Objekt mit cmake



  • Hallo

    ich versuche mich zur Zeit einwenig an Qt und schlage mich hier von Problem zu Problem. ( Danke für eure Hilfe! )
    Nun habe ich ein Problem beim Linken (ach so, ich verwende cmake aus KDevelop4):

    [ 20%] Generating SimuAdmin.moc
    Scanning dependencies of target SimuAdmin
    [ 40%] Building CXX object CMakeFiles/SimuAdmin.dir/archive.cpp.o
    [ 60%] Building CXX object CMakeFiles/SimuAdmin.dir/parameters.cpp.o
    [ 80%] Building CXX object CMakeFiles/SimuAdmin.dir/SimuAdmin.cpp.o
    [100%] Building CXX object CMakeFiles/SimuAdmin.dir/main.cpp.o
    Linking CXX executable SimuAdmin
    CMakeFiles/SimuAdmin.dir/archive.cpp.o: In function Archive::Archive(QObject*)': archive.cpp:(.text+0x2d): undefined reference tovtable for Archive'
    CMakeFiles/SimuAdmin.dir/archive.cpp.o: In function Archive::Archive(QObject*)': archive.cpp:(.text+0xa9): undefined reference tovtable for Archive'
    CMakeFiles/SimuAdmin.dir/archive.cpp.o: In function Archive::~Archive()': archive.cpp:(.text+0x10b): undefined reference tovtable for Archive'
    CMakeFiles/SimuAdmin.dir/archive.cpp.o: In function Archive::~Archive()': archive.cpp:(.text+0x145): undefined reference tovtable for Archive'
    CMakeFiles/SimuAdmin.dir/archive.cpp.o: In function Archive::~Archive()': archive.cpp:(.text+0x17f): undefined reference tovtable for Archive'
    collect2: ld returned 1 exit status
    make[2]: *** [SimuAdmin] Fehler 1
    make[1]: *** [CMakeFiles/SimuAdmin.dir/all] Fehler 2
    make: *** [all] Fehler 2

    Das archive.h sieht so aus:

    #include <QtGui>
    
    class Archive: public QObject
    {
      Q_OBJECT
      public:
        Archive ( QObject* parent = 0 );
        virtual ~Archive ();
      private:
        QStringList	*list;
    
    };
    

    Und die archive.cpp so:

    #include "archive.h"
    
    #include <QtGui>
    
    Archive::Archive ( QObject* parent ) : QObject ( parent ) {
       list	= new QStringList();
    }
    
    Archive::~Archive() { }
    

    Kann mir jemand helfen?
    Danke



  • Das CMakeLists.txt wäre noch interessant - das nächste mal sofort mitposten.

    Trotzdem die Lösung:
    Du musst archive.h moccen und das Resultat mitkompilieren und linken.
    Dafür nimmst du QT4_WRAP_CPP. Doku dazu auf cmake.org.
    Das Macro Q_OBJECT fügt im Header die Deklaration einiger Methoden hinzu, die Implementierung wird mit moc erstellt. Fehlt die Implementierung einer virtuellen Methode kann natürlich auch kein Eintrag in der vtable angelegt werden.


Anmelden zum Antworten