Seite 1 von 1
[gelöst]Q_OBJECT und moc fehler
Verfasst: 19. März 2006 16:34
von Spielgrips
Hallo und zwar habe ich ein Problem mit Q_OBJECT und den moc compiler.
Ich habe mit qmake -project eine Projectdatei gemacht und habe in meine Projectdatei eine Modulerweiterung eingetragen das auch die Q3 Layer mit unterstützt werden und wollte meine xab.cpp und xab.h kompilieren und habe das ausgeführt:
Ausgabe ist das:
Code: Alles auswählen
C:\PROGRAMMIEREN\CPP_PROJECTS\xab>make
make -f Makefile.Release
make[1]: Entering directory `C:/PROGRAMMIEREN/CPP_PROJECTS/xab'
g++ -c -O2 -O2 -frtti -fexceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_D
LL -DQT_NO_DEBUG -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -D
QT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"C:/Qt/4.1.1/include/QtCore" -I"C:/Qt/4.1.1
/include/QtGui" -I"C:/Qt/4.1.1/include/Qt3Support" -I"C:/Qt/4.1.1/include" -I"."
-I"C:/Qt/4.1.1/include/ActiveQt" -I"release" -I"." -I"C:/Qt/4.1.1/mkspecs/win32
-g++" -o release\xab.o xab.cpp
In file included from xab.moc:10,
from xab.cpp:10:
xab.h:15: error: redefinition of `class xab_core'
xab.h:15: error: previous definition of `class xab_core'
xab.h:49: error: redefinition of `xab_core::xab_core()'
xab.h:49: error: `xab_core::xab_core()' previously defined here
xab.h:49: confused by earlier errors, bailing out
make[1]: *** [release\xab.o] Error 1
make[1]: Leaving directory `C:/PROGRAMMIEREN/CPP_PROJECTS/xab'
make: *** [release] Error 2
Ich habe mit moc meine xab.h durchforsten lassen und das mit diesen Code:
moc xab.h -o xab.moc
Ich habe diese .moc in mein release Ordner reinkopiert und per #include eingefügt und es kommt wie oben dann zu diesen Fehler. Wenn ich meine class nicht auf eine .h auslager, dann funktioniert alles reibungslos!
Hier noch meine Projectdatei:
Code: Alles auswählen
######################################################################
# Automatically generated by qmake (2.00a) So 19. Mrz 18:20:47 2006
######################################################################
TEMPLATE = app
TARGET +=
DEPENDPATH += .
INCLUDEPATH += .
QT += qt3support
# Input
HEADERS += xab.h
SOURCES += xab.cpp
Wenn ich eben wie oben gesagt nicht auslager, dann erstellt er auch selbst die .moc datei und alles klappt

! Aber ich will ja auch mal meine class's auslagern

!
Verfasst: 19. März 2006 18:49
von BartSimpson
was steht in der xab.h drin??
Denn da sagt er ja das was nicht stimmt.
Verfasst: 19. März 2006 19:00
von Spielgrips
Die xab.h ist meine Headerdatei wo meine Class drin ist. Sie ist auch in der xab.pro mit eingetragen.
xab.h
Code: Alles auswählen
#include <QMainWindow>
#include <QTime>
#include <Q3ListView>
#include <Q3ListViewItem>
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QToolBar>
#include <QToolButton>
#include <QMessageBox>
#include <QObject>
class xab_core : public QMainWindow
{
Q_OBJECT
public:
xab_core();
~xab_core();
QTime startTime;
private:
Q3ListView* ListView;
Q3ListViewItem* treeDirectory;
Q3ListViewItem* treeSubDiretory;
Q3ListViewItem* treeItems;
// Menu and toolbars
QMenu* qmServer;
QToolBar* qtXabia;
QToolButton* qtbServer;
// Action
QAction* actConnect;
private slots:
void connectServer(void);
};
xab_core::xab_core()
{
this->startTime.start();
this->ListView = new Q3ListView(this);
this->ListView->setGeometry(10, 80, 430, 310);
// Columns and items
this->ListView->addColumn("Ordner", 200);
this->ListView->addColumn("Version");
this->ListView->addColumn("Datum");
this->ListView->setRootIsDecorated(true);
this->treeDirectory = new Q3ListViewItem(this->ListView, "/home/");
this->treeSubDiretory = new Q3ListViewItem(this->treeDirectory, "lager");
this->treeItems = new Q3ListViewItem(this->treeSubDiretory, "pic1.psd", "19.03.06", "1.0");
this->ListView->show();
// Action and slots
this->actConnect = new QAction(tr("Connect"), this);
this->actConnect->setShortcut(tr("Ctrl+C"));
connect(actConnect, SIGNAL(triggered()), this, SLOT(quit()));
// MenuBar
this->qmServer = menuBar()->addMenu(tr("&Server"));
this->qmServer->addAction(this->actConnect);
// Toolbar
this->qtXabia = new QToolBar(this, "xabia_toolbar");
this->qtXabia->setGeometry(0, 20, 450, 53);
this->qtbServer = new QToolButton(this->qtXabia);
this->qtbServer->setIcon(QIcon("xab_server.png"));
this->qtbServer->setText("Verbinden");
this->qtbServer->setFixedSize(80, 53);
this->qtbServer->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
connect(qtbServer, SIGNAL(triggered()), this, SLOT(quit()));
//
}
xab_core::~xab_core()
{
// not defined!
}
void xab_core::connectServer(void)
{
QMessageBox* msgBox = new QMessageBox(this);
msgBox->setText("du hast geklickt!");
msgBox->show();
}
Wenn ich keine .moc erstell und normal mit make alles mach, kommt eine moc_xab.cpp raus, was der gleiche inhalt ist was mit dem moc befehl mach wenn ich die .h durchforste...
Wie gesagt, wenn ich das nicht auslager, dann klappt alles..
Verfasst: 19. März 2006 19:10
von BartSimpson
wenn das alles im .h steht, dann muss ja deine cpp fast leer sein. irgenwo definiertst du deine Klasse 2 mal.
Verfasst: 19. März 2006 19:15
von Spielgrips
Eigentlich nicht

!
Code: Alles auswählen
#include <QApplication>
#include <QSplashScreen>
#include <QPixmap>
#include <QWidget>
#include <QIcon>
#include <Qt>
#include "xab.h"
int main(int argc, char* argv[])
{
QApplication xab(argc, argv);
xab.setWindowIcon(QIcon("xab.png"));
QPixmap qpxSplash("xab_splash.png");
QSplashScreen* xab_splash = new QSplashScreen(qpxSplash);
xab_splash->show();
xab_core* mywidget = new xab_core();
mywidget->setGeometry(250, 150, 450, 400);
mywidget->setWindowTitle("Xabia Server :: Repository");
while (mywidget->startTime.elapsed() < 2000);
mywidget->show();
xab_splash->finish(mywidget);
delete xab_splash;
return xab.exec();
}
Verfasst: 19. März 2006 19:34
von Spielgrips
Wenn ich den HEADERS Eintrag weglasse kommt dann dieser Fehler raus:
Code: Alles auswählen
C:\PROGRAMMIEREN\CPP_PROJECTS\xab>make
qmake -win32 -o Makefile xab.pro
make -f Makefile.Release
make[1]: Entering directory `C:/PROGRAMMIEREN/CPP_PROJECTS/xab'
g++ -c -O2 -O2 -Wall -frtti -fexceptions -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_D
LL -DQT_NO_DEBUG -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -D
QT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"C:/Qt/4.1.1/include/QtCore" -I"C:/Qt/4.1.1
/include/QtGui" -I"C:/Qt/4.1.1/include/Qt3Support" -I"C:/Qt/4.1.1/include" -I"."
-I"C:/Qt/4.1.1/include/ActiveQt" -I"release" -I"." -I"C:/Qt/4.1.1/mkspecs/win32
-g++" -o release\xab.o xab.cpp
g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runt
ime-pseudo-reloc -Wl,-s -Wl,-s -Wl,-subsystem,windows -o "release\xab.exe" relea
se\xab.o -L"C:\Qt\4.1.1\lib" -lmingw32 -lqtmain -lQt3Support4 -lQtGui4 -lQtCore
4
release\xab.o(.text+0x8f):xab.cpp: undefined reference to `vtable for xab_core'
release\xab.o(.text+0x96):xab.cpp: undefined reference to `vtable for xab_core'
release\xab.o(.text+0xfe2):xab.cpp: undefined reference to `xab_core::staticMeta
Object'
release\xab.o(.text+0x10a5):xab.cpp: undefined reference to `xab_core::staticMet
aObject'
release\xab.o(.text+0x11a4):xab.cpp: undefined reference to `xab_core::staticMet
aObject'
release\xab.o(.text+0x1cdf):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x1ce6):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x2c32):xab.cpp: undefined reference to `xab_core::staticMet
aObject'
release\xab.o(.text+0x2cf5):xab.cpp: undefined reference to `xab_core::staticMet
aObject'
release\xab.o(.text+0x2df4):xab.cpp: undefined reference to `xab_core::staticMet
aObject'
release\xab.o(.text+0x38ab):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x38b2):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x38db):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x38e2):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x390c):xab.cpp: undefined reference to `vtable for xab_core
'
release\xab.o(.text+0x3913):xab.cpp: more undefined references to `vtable for xa
b_core' follow
collect2: ld returned 1 exit status
make[1]: *** [release\xab.exe] Error 1
make[1]: Leaving directory `C:/PROGRAMMIEREN/CPP_PROJECTS/xab'
make: *** [release] Error 2
Die xab.h ist ja im .cpp per #include drin...
Verfasst: 19. März 2006 19:55
von Spielgrips
Ich habs,
irgendwie legt QT auf ordentliche Verteilung großen Wert! Naja und zwar ist ja moc ein einfacher compiler und daher muss man Defination und Deklaration von Headerfiles trennen.
Ich habe Deklaration in xab_core.h ausgelagert und die direkte Defination von Konstruktor, Destruktor, Methoden in eine .cpp kopiert und per Konstante verhindern lassen, dass die Klasse nicht nochmal deklariert wird.
Danach habsch nochmal qmake -project gemacht und den QT Modul Eintrag wieder eingetragen und dann nochmal die Project nochmal qmaken lassen und nur noch make eintippen und schon geht alles.
Ich kann mir das nur so erklären das moc Schwierigkeiten hat Deklaration und Defination auseinander zu halten und keine .moc erstellt..