LINUX.ORG.RU

QT и QTcpServer


0

0

Добрый день!

Пытюсь написать сервер на 80м порту, которая будет отображать, что идет с браузера.

Qt4.4.0 + Windows + MinGW

Помогите, пожалуйста выяснить причину проблемы. Второй день уже бьюсь..


*main.cpp


#include <QApplication>
#include <QHostAddress>
#include "dialog.h"
#include "server.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    Dialog dialog;
    Server server;
    server.listen(QHostAddress::Any, 80);
    dialog.show();
    return app.exec();
}

*dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
    setupUi(this);

}

*dialog.h

#ifndef DIALOG_H
#define DIALOG_H
#include "ui_dialog.h"
class Dialog: public QDialog, public Ui::Dialog
{
	Q_OBJECT
public:
	Dialog(QWidget *parent = 0);
};


#endif

*server.h

#ifndef SERVER_H
#define SERVER_H

#include <QTcpServer>
#include <QTcpSocket>

class Server : public QTcpServer
{
    Q_OBJECT
public:
    Server(QObject* parent = 0);
private:
    void incomingConnection(int socketId);
};

class ClientSocket : public QTcpSocket
{
    Q_OBJECT
public:
    ClientSocket(QObject* parent=0);
private slots:
    void readClient();
};

#endif // SERVER_H_INCLUDED

*server.cpp

#include "server.h"
#include <QMessageBox>

Server::Server(QObject* parent) : QTcpServer(parent)
{

}

void Server::incomingConnection(socketId)
{
    ClientSocket* socket = new ClientSocket(this);
    socket->setSocketDescriptor(socketId);
}

ClientSocket::ClientSocket(QObject* parent=0) : QTcpSocket(parent)
{
    connect(this, SIGNAL(readyRead()), this, SLOT(readClient()));
    connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater()));
}

void ClientSocket::readClient()
{
    QMessageBox::information(0, "read", "Могу читать данные от клиента");
}


ЧТо бы я не делал, всегда: ndefined reference to `vtable for Server'


E:\Qt\4.4.0\bin\socket>make
mingw32-make -f Makefile.Debug all
mingw32-make[1]: Entering directory `E:/Qt/4.4.0/bin/socket'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -mthreads -Wl -Wl,-subsystem,windows -o debug\socket.exe tmp/obj/debug_shared
/dialog.o tmp/obj/debug_shared/main.o tmp/obj/debug_shared/moc_dialog.o  -L"e:\Q
t\4.4.0\lib" -L"e:\Qt\4.4.0\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtNetworkd4 -lQ
tCored4
tmp/obj/debug_shared/main.o(.text+0x1a7): In function `Z5qMainiPPc':
E:/Qt/4.4.0/bin/socket/main.cpp:11: undefined reference to `Server::Server(QObje
ct*)'
tmp/obj/debug_shared/main.o(.text$_ZN6ServerD1Ev[Server::~Server()]+0xb): In fun
ction `ZSt17__verify_groupingPKcjRKSs':
E:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/locale
_
facets.tcc:2494: undefined reference to `vtable for Server'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\socket.exe] Error 1
mingw32-make[1]: Leaving directory `E:/Qt/4.4.0/bin/socket'
mingw32-make: *** [debug-all] Error 2
anonymous

попробуй закомментить Q_OBJECT в описании Server

anonymous
()

кстати а moc файл создан?

anonymous
()

ясен перец, moc файл для Server'a не создался. Почисти проект, удали Makefile, и заново

# qmake
# make

и на всякий случай .pro файл в студию

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Diagnostics

moc will warn you about a number of dangerous or illegal constructs in the Q_OBJECT class declarations.

If you get linkage errors in the final building phase of your program, saying that YourClass::className() is undefined or that YourClass lacks a vtable, something has been done wrong. Most often, you have forgotten to compile or #include the moc-generated C++ code, or (in the former case) include that object file in the link command. If you use qmake, try rerunning it to update your makefile. This should do the trick.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Спасибо БОЛЬШОЕ! Вы помогли!!! Я еще только познаю всё.. Не могу понять.. Как Вы поняли, что нужно убить Make и всё по новой? Почему Makefile не обновлялся? Я же часто делал qmake make

anonymous
()
Ответ на: комментарий от alex_custov

старые Qt-шные грабли... Как правило, когда на vtable ругается - дело в Q_OBJECT или *.moc файле. Это так на будущее.

irq
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.