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 functionArchive::Archive(QObject*)': archive.cpp:(.text+0x2d): undefined reference to
vtable for Archive'
CMakeFiles/SimuAdmin.dir/archive.cpp.o: In functionArchive::Archive(QObject*)': archive.cpp:(.text+0xa9): undefined reference to
vtable for Archive'
CMakeFiles/SimuAdmin.dir/archive.cpp.o: In functionArchive::~Archive()': archive.cpp:(.text+0x10b): undefined reference to
vtable for Archive'
CMakeFiles/SimuAdmin.dir/archive.cpp.o: In functionArchive::~Archive()': archive.cpp:(.text+0x145): undefined reference to
vtable for Archive'
CMakeFiles/SimuAdmin.dir/archive.cpp.o: In functionArchive::~Archive()': archive.cpp:(.text+0x17f): undefined reference to
vtable for Archive'
collect2: ld returned 1 exit status
make[2]: *** [SimuAdmin] Fehler 1
make[1]: *** [CMakeFiles/SimuAdmin.dir/all] Fehler 2
make: *** [all] Fehler 2Das 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.