Seite 1 von 1

Problem mit Q_OBJECT

Verfasst: 26. November 2007 17:30
von cool.runnings
Hallo,

ich probiere mit Eclipse (3.3), CDT (4) und QT4 ein Programm zu schreiben, was einige Netzwerkverbindungen aufbaut.
Dazu habe ich die QtNetwork eingebunden.

Meine Headerdatei sieht folgendermaßen aus:

Code: Alles auswählen

#ifndef NETWORKLIB_H_
#define NETWORKLIB_H_

// --------------------------------------------------------
// Includes -
// --------------------------------------------------------
#include "_tycs.h"
#include "inifile.h"
#include </usr/include/qt4/QtNetwork/QTcpSocket>
#include </usr/include/qt4/QtNetwork/QtNetwork>

// --------------------------------------------------------
// Class -
// --------------------------------------------------------
class MyNetwork : public QTcpSocket
{
	Q_OBJECT;
	
public:
	QTcpSocket tcpSocket;
	int nextBlockSize;
	
public:
	MyNetwork();
	
public slots:
	void tcpConnected();
	void tcpDisconnected();
	void tcpRead();
	void tcpError();
};
#endif /*NETWORKLIB_H_*/
Die CPP Datei:

Code: Alles auswählen

// --------------------------------------------------------
// Includes -
// --------------------------------------------------------
#include "networkLib.h"
#include "inifile.h"
#include "typeDefs.h"
#include <iostream>

MyNetwork::MyNetwork() 
{
	connect ( &tcpSocket, 
			  SIGNAL(connected()), 
			  this, 
			  SLOT(tcpConnected()));
	        
	connect ( &tcpSocket,
			  SIGNAL(disconnected()),
			  this, 
			  SLOT(tcpDisconnected()));
	
	connect ( &tcpSocket, 
			  SIGNAL(readyRead()),
	          this, 
	          SLOT(tcpRead()));
	
	connect ( &tcpSocket, 
			 SIGNAL(error(QAbstractSocket::SocketError)),
	         this, 
	         SLOT(tcpError()));
	
	tcpSocket.connectToHost("xxx", 21);
}

void MyNetwork::tcpConnected()
{
    std::cout << "Connected successfully";
    std::cout.flush();
}

void MyNetwork::tcpDisconnected()
{
    std::cout << "Disconnected successfully";
    std::cout.flush();
}

void MyNetwork::tcpRead()
{
    std::cout << "Read\n";
    std::cout.flush();
    
    char    buf[512];
    int     read_ret    = 0;
   
    
    if (tcpSocket.bytesAvailable() != 0)
    {
    	read_ret =  tcpSocket.read(buf, 512);
        printf("received[%i] '%s'\n", read_ret, buf);
    }  

    QString nextFortune;
    
    QDataStream in(&tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);
    
    if (nextBlockSize == 0) 
    {
    	temp = tcpSocket.bytesAvailable();
    	in >> nextFortune;
    }
    
    std::cout << nextFortune << "\n";
    std::cout << temp;
    std::cout.flush();*/
}

void MyNetwork::tcpError()
{
    std::cout << "Error";
    std::cout.flush();
}


int main()
{
	std::cout << "test";
	
	MyNetwork *nw = new MyNetwork();
	return 0;
}
Wenn ich es nun "builde" mit g++ erscheint folgende Meldung:

Code: Alles auswählen

undefined reference to `vtable for MyNetwork'	
Wenn ich nun Q_OBJECT rauslasse, kann ich builden ohne Fehlermeldung. Wenn ich das Programm dann aber laufen lasse, kommt folgende Meldung:

Code: Alles auswählen

Object::connect: No such slot QTcpSocket::tcpConnected()
Object::connect: No such slot QTcpSocket::tcpDisconnected()
Object::connect: No such slot QTcpSocket::tcpRead()
Object::connect: No such slot QTcpSocket::tcpError()
Ich hab da schon was von moc Dateien gelesen, kann aber nicht wirklich was damit anfangen.
Ich hoffe Ihr könnt mir helfen.

Gruß
Michael

Verfasst: 26. November 2007 17:55
von Christian81
benutze qmake. Und dort die HEADERS - variable korrekt füllen.

Verfasst: 26. November 2007 17:56
von cool.runnings
Christian81 hat geschrieben:benutze qmake. Und dort die HEADERS - variable korrekt füllen.
Was meinst du mit HEADERS - variable korrekt füllen?

Verfasst: 26. November 2007 18:01
von Christian81

Verfasst: 26. November 2007 18:14
von cool.runnings
Also ich habe jetzt eine .pro datei

Code: Alles auswählen

######################################################################
# Automatically generated by qmake (2.01a) Mo Nov 26 18:06:45 2007
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += . \
               /home/michael/Desktop/bo/trunk/src/[includes] \
               /usr/include/qt4/
              

# Input
HEADERS += inifile.h \
           networkLib.h \
           typeDefs.h \
           /usr/include/qt4/QtNetwork/QTcpSocket \
           /usr/include/qt4/QtNetwork/qtcpsocket.h \
           /usr/include/qt4/QtNetwork/QtNetwork \
           /usr/include/qt4/QtNetwork/qhttp.h \
           /usr/include/qt4/QtNetwork/qsslerror.h \
           /usr/include/qt4/QtNetwork/qnetworkinterface.h \
           /usr/include/qt4/QtNetwork/qauthenticator.h \
           /usr/include/qt4/QtNetwork/qhostinfo.h \
           /usr/include/qt4/QtNetwork/qnetworkproxy.h \
           /usr/include/qt4/QtNetwork/qhostaddress.h \
           /usr/include/qt4/QtNetwork/qsslcipher.h \
           /usr/include/qt4/QtNetwork/qsslkey.h \
           /usr/include/qt4/QtNetwork/qftp.h \
           /usr/include/qt4/QtNetwork/qssl.h \
           /usr/include/qt4/QtNetwork/qtcpserver.h \
           /usr/include/qt4/QtNetwork/qabstractsocket.h \
           /usr/include/qt4/QtNetwork/qsslcertificate.h \
           /usr/include/qt4/QtNetwork/qurlinfo.h \
           /usr/include/qt4/QtNetwork/qsslsocket.h \
           /usr/include/qt4/QtNetwork/qudpsocket.h
SOURCES += inifile.cpp networkLib.cpp
und dann noch nen neuen makefile

Code: Alles auswählen

#############################################################################
# Makefile for building: networkLib
# Generated by qmake (2.01a) (Qt 4.3.0) on: Mo Nov 26 18:09:56 2007
# Project:  networkLib.pro
# Template: app
# Command: /usr/bin/qmake -unix -o Makefile networkLib.pro
#############################################################################

####### Compiler, tools and options

CC            = gcc
CXX           = g++
DEFINES       = -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS        = -pipe -g -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS      = -pipe -g -Wall -W -D_REENTRANT $(DEFINES)
INCPATH       = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../[includes] -I/usr/include/qt4 -I. -I.
LINK          = g++
LFLAGS        = 
LIBS          = $(SUBLIBS)  -L/usr/lib -lQtGui -lQtCore -lpthread
AR            = ar cqs
RANLIB        = 
QMAKE         = /usr/bin/qmake
TAR           = tar -cf
COMPRESS      = gzip -9f
COPY          = cp -f
SED           = sed
COPY_FILE     = $(COPY)
COPY_DIR      = $(COPY) -r
INSTALL_FILE  = install -m 644 -p
INSTALL_DIR   = $(COPY_DIR)
INSTALL_PROGRAM = install -m 755 -p
DEL_FILE      = rm -f
SYMLINK       = ln -sf
DEL_DIR       = rmdir
MOVE          = mv -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p

####### Output directory

OBJECTS_DIR   = ./

####### Files

SOURCES       = inifile.cpp \
		networkLib.cpp moc_networkLib.cpp \
		moc_qtcpsocket.cpp \
		moc_qhttp.cpp \
		moc_qftp.cpp \
		moc_qtcpserver.cpp \
		moc_qabstractsocket.cpp \
		moc_qsslsocket.cpp \
		moc_qudpsocket.cpp
OBJECTS       = inifile.o \
		networkLib.o \
		moc_networkLib.o \
		moc_qtcpsocket.o \
		moc_qhttp.o \
		moc_qftp.o \
		moc_qtcpserver.o \
		moc_qabstractsocket.o \
		moc_qsslsocket.o \
		moc_qudpsocket.o
DIST          = /usr/share/qt4/mkspecs/common/g++.conf \
		/usr/share/qt4/mkspecs/common/unix.conf \
		/usr/share/qt4/mkspecs/common/linux.conf \
		/usr/share/qt4/mkspecs/qconfig.pri \
		/usr/share/qt4/mkspecs/features/qt_functions.prf \
		/usr/share/qt4/mkspecs/features/qt_config.prf \
		/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
		/usr/share/qt4/mkspecs/features/default_pre.prf \
		/usr/share/qt4/mkspecs/features/debug.prf \
		/usr/share/qt4/mkspecs/features/default_post.prf \
		/usr/share/qt4/mkspecs/features/warn_on.prf \
		/usr/share/qt4/mkspecs/features/qt.prf \
		/usr/share/qt4/mkspecs/features/unix/thread.prf \
		/usr/share/qt4/mkspecs/features/moc.prf \
		/usr/share/qt4/mkspecs/features/resources.prf \
		/usr/share/qt4/mkspecs/features/uic.prf \
		/usr/share/qt4/mkspecs/features/yacc.prf \
		/usr/share/qt4/mkspecs/features/lex.prf \
		networkLib.pro
QMAKE_TARGET  = networkLib
DESTDIR       = 
TARGET        = networkLib

first: all
####### Implicit rules

.SUFFIXES: .o .c .cpp .cc .cxx .C

.cpp.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.cc.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.cxx.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.C.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.c.o:
	$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(OBJECTS)  
	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

Makefile: networkLib.pro  /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/share/qt4/mkspecs/common/g++.conf \
		/usr/share/qt4/mkspecs/common/unix.conf \
		/usr/share/qt4/mkspecs/common/linux.conf \
		/usr/share/qt4/mkspecs/qconfig.pri \
		/usr/share/qt4/mkspecs/features/qt_functions.prf \
		/usr/share/qt4/mkspecs/features/qt_config.prf \
		/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
		/usr/share/qt4/mkspecs/features/default_pre.prf \
		/usr/share/qt4/mkspecs/features/debug.prf \
		/usr/share/qt4/mkspecs/features/default_post.prf \
		/usr/share/qt4/mkspecs/features/warn_on.prf \
		/usr/share/qt4/mkspecs/features/qt.prf \
		/usr/share/qt4/mkspecs/features/unix/thread.prf \
		/usr/share/qt4/mkspecs/features/moc.prf \
		/usr/share/qt4/mkspecs/features/resources.prf \
		/usr/share/qt4/mkspecs/features/uic.prf \
		/usr/share/qt4/mkspecs/features/yacc.prf \
		/usr/share/qt4/mkspecs/features/lex.prf
	$(QMAKE) -unix -o Makefile networkLib.pro
/usr/share/qt4/mkspecs/common/g++.conf:
/usr/share/qt4/mkspecs/common/unix.conf:
/usr/share/qt4/mkspecs/common/linux.conf:
/usr/share/qt4/mkspecs/qconfig.pri:
/usr/share/qt4/mkspecs/features/qt_functions.prf:
/usr/share/qt4/mkspecs/features/qt_config.prf:
/usr/share/qt4/mkspecs/features/exclusive_builds.prf:
/usr/share/qt4/mkspecs/features/default_pre.prf:
/usr/share/qt4/mkspecs/features/debug.prf:
/usr/share/qt4/mkspecs/features/default_post.prf:
/usr/share/qt4/mkspecs/features/warn_on.prf:
/usr/share/qt4/mkspecs/features/qt.prf:
/usr/share/qt4/mkspecs/features/unix/thread.prf:
/usr/share/qt4/mkspecs/features/moc.prf:
/usr/share/qt4/mkspecs/features/resources.prf:
/usr/share/qt4/mkspecs/features/uic.prf:
/usr/share/qt4/mkspecs/features/yacc.prf:
/usr/share/qt4/mkspecs/features/lex.prf:
qmake:  FORCE
	@$(QMAKE) -unix -o Makefile networkLib.pro

dist: 
	@$(CHK_DIR_EXISTS) .tmp/networkLib1.0.0 || $(MKDIR) .tmp/networkLib1.0.0 
	$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/networkLib1.0.0/ && $(COPY_FILE) --parents inifile.h networkLib.h typeDefs.h /usr/include/qt4/QtNetwork/QTcpSocket /usr/include/qt4/QtNetwork/qtcpsocket.h /usr/include/qt4/QtNetwork/QtNetwork /usr/include/qt4/QtNetwork/qhttp.h /usr/include/qt4/QtNetwork/qsslerror.h /usr/include/qt4/QtNetwork/qnetworkinterface.h /usr/include/qt4/QtNetwork/qauthenticator.h /usr/include/qt4/QtNetwork/qhostinfo.h /usr/include/qt4/QtNetwork/qnetworkproxy.h /usr/include/qt4/QtNetwork/qhostaddress.h /usr/include/qt4/QtNetwork/qsslcipher.h /usr/include/qt4/QtNetwork/qsslkey.h /usr/include/qt4/QtNetwork/qftp.h /usr/include/qt4/QtNetwork/qssl.h /usr/include/qt4/QtNetwork/qtcpserver.h /usr/include/qt4/QtNetwork/qabstractsocket.h /usr/include/qt4/QtNetwork/qsslcertificate.h /usr/include/qt4/QtNetwork/qurlinfo.h /usr/include/qt4/QtNetwork/qsslsocket.h /usr/include/qt4/QtNetwork/qudpsocket.h .tmp/networkLib1.0.0/ && $(COPY_FILE) --parents inifile.cpp networkLib.cpp .tmp/networkLib1.0.0/ && (cd `dirname .tmp/networkLib1.0.0` && $(TAR) networkLib1.0.0.tar networkLib1.0.0 && $(COMPRESS) networkLib1.0.0.tar) && $(MOVE) `dirname .tmp/networkLib1.0.0`/networkLib1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/networkLib1.0.0


clean:compiler_clean 
	-$(DEL_FILE) $(OBJECTS)
	-$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
	-$(DEL_FILE) $(TARGET) 
	-$(DEL_FILE) Makefile


mocclean: compiler_moc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_source_make_all

compiler_moc_header_make_all: moc_networkLib.cpp moc_qtcpsocket.cpp moc_qhttp.cpp moc_qftp.cpp moc_qtcpserver.cpp moc_qabstractsocket.cpp moc_qsslsocket.cpp moc_qudpsocket.cpp
compiler_moc_header_clean:
	-$(DEL_FILE) moc_networkLib.cpp moc_qtcpsocket.cpp moc_qhttp.cpp moc_qftp.cpp moc_qtcpserver.cpp moc_qabstractsocket.cpp moc_qsslsocket.cpp moc_qudpsocket.cpp
moc_networkLib.cpp: inifile.h \
		/usr/include/qt4/QtNetwork/QTcpSocket \
		/usr/include/qt4/QtNetwork/qtcpsocket.h \
		/usr/include/qt4/QtNetwork/QtNetwork \
		/usr/include/qt4/QtNetwork/qhttp.h \
		/usr/include/qt4/QtNetwork/qsslerror.h \
		/usr/include/qt4/QtNetwork/qnetworkinterface.h \
		/usr/include/qt4/QtNetwork/qauthenticator.h \
		/usr/include/qt4/QtNetwork/qhostinfo.h \
		/usr/include/qt4/QtNetwork/qnetworkproxy.h \
		/usr/include/qt4/QtNetwork/qhostaddress.h \
		/usr/include/qt4/QtNetwork/qsslcipher.h \
		/usr/include/qt4/QtNetwork/qsslkey.h \
		/usr/include/qt4/QtNetwork/qftp.h \
		/usr/include/qt4/QtNetwork/qssl.h \
		/usr/include/qt4/QtNetwork/qtcpserver.h \
		/usr/include/qt4/QtNetwork/qabstractsocket.h \
		/usr/include/qt4/QtNetwork/qsslcertificate.h \
		/usr/include/qt4/QtNetwork/qurlinfo.h \
		/usr/include/qt4/QtNetwork/qsslsocket.h \
		/usr/include/qt4/QtNetwork/qudpsocket.h \
		networkLib.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) networkLib.h -o moc_networkLib.cpp

moc_qtcpsocket.cpp: /usr/include/qt4/QtNetwork/qtcpsocket.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qtcpsocket.h -o moc_qtcpsocket.cpp

moc_qhttp.cpp: /usr/include/qt4/QtNetwork/qhttp.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qhttp.h -o moc_qhttp.cpp

moc_qftp.cpp: /usr/include/qt4/QtNetwork/qftp.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qftp.h -o moc_qftp.cpp

moc_qtcpserver.cpp: /usr/include/qt4/QtNetwork/qtcpserver.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qtcpserver.h -o moc_qtcpserver.cpp

moc_qabstractsocket.cpp: /usr/include/qt4/QtNetwork/qabstractsocket.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qabstractsocket.h -o moc_qabstractsocket.cpp

moc_qsslsocket.cpp: /usr/include/qt4/QtNetwork/qsslsocket.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qsslsocket.h -o moc_qsslsocket.cpp

moc_qudpsocket.cpp: /usr/include/qt4/QtNetwork/qudpsocket.h
	/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) /usr/include/qt4/QtNetwork/qudpsocket.h -o moc_qudpsocket.cpp

compiler_rcc_make_all:
compiler_rcc_clean:
compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
	-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_moc_header_clean 

####### Compile

inifile.o: inifile.cpp inifile.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o inifile.o inifile.cpp

networkLib.o: networkLib.cpp networkLib.h \
		inifile.h \
		/usr/include/qt4/QtNetwork/QTcpSocket \
		/usr/include/qt4/QtNetwork/qtcpsocket.h \
		/usr/include/qt4/QtNetwork/QtNetwork \
		/usr/include/qt4/QtNetwork/qhttp.h \
		/usr/include/qt4/QtNetwork/qsslerror.h \
		/usr/include/qt4/QtNetwork/qnetworkinterface.h \
		/usr/include/qt4/QtNetwork/qauthenticator.h \
		/usr/include/qt4/QtNetwork/qhostinfo.h \
		/usr/include/qt4/QtNetwork/qnetworkproxy.h \
		/usr/include/qt4/QtNetwork/qhostaddress.h \
		/usr/include/qt4/QtNetwork/qsslcipher.h \
		/usr/include/qt4/QtNetwork/qsslkey.h \
		/usr/include/qt4/QtNetwork/qftp.h \
		/usr/include/qt4/QtNetwork/qssl.h \
		/usr/include/qt4/QtNetwork/qtcpserver.h \
		/usr/include/qt4/QtNetwork/qabstractsocket.h \
		/usr/include/qt4/QtNetwork/qsslcertificate.h \
		/usr/include/qt4/QtNetwork/qurlinfo.h \
		/usr/include/qt4/QtNetwork/qsslsocket.h \
		/usr/include/qt4/QtNetwork/qudpsocket.h \
		typeDefs.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o networkLib.o networkLib.cpp

moc_networkLib.o: moc_networkLib.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_networkLib.o moc_networkLib.cpp

moc_qtcpsocket.o: moc_qtcpsocket.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qtcpsocket.o moc_qtcpsocket.cpp

moc_qhttp.o: moc_qhttp.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qhttp.o moc_qhttp.cpp

moc_qftp.o: moc_qftp.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qftp.o moc_qftp.cpp

moc_qtcpserver.o: moc_qtcpserver.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qtcpserver.o moc_qtcpserver.cpp

moc_qabstractsocket.o: moc_qabstractsocket.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qabstractsocket.o moc_qabstractsocket.cpp

moc_qsslsocket.o: moc_qsslsocket.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qsslsocket.o moc_qsslsocket.cpp

moc_qudpsocket.o: moc_qudpsocket.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qudpsocket.o moc_qudpsocket.cpp

####### Install

install:   FORCE

uninstall:   FORCE

FORCE:


Aber laufen tuts immer noch nicht.

Verfasst: 26. November 2007 18:23
von Christian81
In die pro-Datei müssen nur deine Includes, nichts von /usr/include/qt4/ und auch keine absoluten Pfade mit deinem Verzeichnis!

networklib.h wird laut deinem Makefile auf alle Fälle mit moc bearbeitet.