IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

[Compilation] {QtNetwork} Compilation projet SDL + module Qt.

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut [Compilation] {QtNetwork} Compilation projet SDL + module Qt.
    Bonjour, je souhaite utiliser le module Network de Qt dans mon projet qui tourne avec la SDL en C++.

    J'ai tenté une compilation à la main d'un projet simple:
    main.cpp initialise SDL et crée la fenetre tandis que QtClient.cpp
    contient la classe Client ainsi que ses méthodes (QtClient.hpp se
    contentant de déclarer le prototype de la classe...)

    Sous CodeBlocks, j'ai tout linké les modules utilisés:
    QtGui4, QtNetwork4 et QtCore4.

    J'ai aussi ajouté les dossiers include.

    La compilation passe... mais bute sur une erreur:
    obj\Debug\QtClient.o: In function `ZN6ClientC2Ev':
    D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
    D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
    obj\Debug\QtClient.o: In function `ZN6ClientC1Ev':
    D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
    D:\Programmation\C++\SDLavecQt\QtClient.cpp:13: undefined reference to `vtable for Client'
    === Build finished: 4 errors, 0 warnings ===
    Après plusieurs recherches il me semble que ce soit l'appel de Moc
    qui pose problème puisqu'il n'est pas appellé et c'est lui qui est en charge
    de gérer les connexions de SIGNAL & SLOTS.

    Donc je tente de passer par la méthode classique de compilation
    "qmake -project, qmake, make" en ajoutant les includes et links manquants.
    Je finis par buter sur d'autres problèmes de compilation...

    Quelqun aurait-il déjà essayé de mélanger SDL avec un module de Qt ?

    Je précise si ce n'était pas clair, je ne veux pas utiliser les fonctions de dessin
    et gestion de fenêtre de Qt, je tiens à garder SDL car j'ai tout fais dessus.
    Je veux utiliser le module Network de Qt et surtout profiter des SIGNALS & SLOTS si utiles et ne pas recoder un gestionnaire d'évenements similaire mais en mal fait comparé à Qt...

    Merci de m'avoir lu et d'avance merci.



    main.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #ifdef __APPLE__
    #include <SDL/SDL.h>
    #else
    #include <SDL.h>
    #endif
     
    #include <iostream>
    #include <QDialog>
    #include <QApplication>
    #include <QtNetwork>
     
    int main ( int argc, char** argv )
    {
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
        atexit(SDL_Quit);
     
        SDL_Surface* screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
     
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
        bool done = false;
        while (!done)
        {
            SDL_Event event;
            SDL_PollEvent(&event);
     
            switch( event.type )
            {
                case SDL_QUIT: done = true; 
     
                case SDL_KEYDOWN:
                {
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_ESCAPE: done = true; break;
                        default:;
                    }
                }
            }
     
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 255, 255));
            SDL_Flip(screen);
        }
     
        return 0;
    }

    Qtclient.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include <QtGui>
    #include <QtNetwork>
    #include <iostream>
     
    #include "QtClient.hpp"
     
    using namespace std;
     
     
    Client::Client(QWidget* parent) : QDialog(parent)
    {
     
        connect(&tcpSocket, SIGNAL(connected()), this, SLOT( ConnexionAccepte() ));
     
        connect(&tcpSocket, SIGNAL(disconnected()), this, SLOT( ConnectionClosedByServer() ));
     
        connect(&tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT( error() ));
     
        connect(&tcpSocket, SIGNAL(readyRead()), this, SLOT( ReceiveData() ));
    }
     
     
    void Client::ToggleConnexion()
    {
        // Si le socket est connecté alors on le déconnecte.
        if( tcpSocket.state() == 3 )
        {
           CloseConnection();
        }
        else 
           if( tcpSocket.state() == 0 ) // UnconnectedState.
           {
               nextBlockSize = 0;
           } 
    }
     
    void Client::sendRequest()
    {
    }
     
     
     
    void Client::ReceiveData()
    {
    }
     
     
     
    void Client::ConnexionAccepte()
    {
    }
     
     
    void Client::ConnectionClosedByServer()
    {
        CloseConnection();
    }
     
     
    void Client::error()
    {
        CloseConnection();
    }
     
     
    void Client::CloseConnection()
    {
        tcpSocket.close();
    }


    QtClient.hpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #ifndef QT_CLIENT
    #define QT_CLIENT
     
    #include <QDialog>
    #include <QTcpSocket>
     
    class Client : public QDialog
    {
        Q_OBJECT
     
        public:
           Client(QWidget *parent = 0);
     
        private slots:
            void ConnexionAccepte();
            void ConnectionClosedByServer();
            void error();
            void sendRequest();
            void ReceiveData();
            void ToggleConnexion();
            void CloseConnection();
     
        private:
            QTcpSocket tcpSocket;
            quint16 nextBlockSize;
    };
     
    #endif

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    J'ai un peu joué avec, mais j'ai zappé la partie gestion des événements SDL pour ne garder que l'utilisation des fonctions de dessins.

    Pour ce que tu veux faire, tu peux tenter en instanciant une QApplication, et en appellant QApplication::processEvent() à chaque tour de la boucle d'événement. MAis je crains qu'il n'y ait conflit avec le dispatch des événements Qt et SDL :/

    Juste un truc, tu as absolument besoin des fonctions de dessin de Qt puisque tu utilises QDialog, donc tu utilises les moduls Core, Gui et Network.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut
    Bonjour,
    J'ai utilisé un QDialog car il hérite de QObject, j'ai tenté avec un QObject sans plus de succès...
    Si les 2 gestionnaires d'évenements se parasitent (remarque judicieuse) alors serait-il possible de réinterpreter certains SIGNALS/SLOTS dans le gestionnaire de la SDL ?
    Ca me parait très compliqué mais bon...
    A moins que quelqun me démontre que l'utilisation des signaux et slots
    peut être indépendante du gestionnaire d'évenements de Qt...

    Sinon IrmatDen, tu penses avoir une idée/piste à propos de mon blocage de compilation "undefined reference to `vtable for Client'" ?

  4. #4
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Pour ton erreur de moc, on va me dire que je dis n'importe quoi, mais C::B n'est clairement pas adapté à l'utilisation de Qt, et c'est pas 2/3 hacks qui vont t'aider à l'utiliser. Pour l'instant, le plus simple est d'utiliser des projets de type Makefiles en rajoutant la possibilité de lancer qmake depuis le menu tools dans le répertoire du projet. Je ne m'étendrai pas plus sur ce sujet...

    serait-il possible de réinterpreter certains SIGNALS/SLOTS dans le gestionnaire de la SDL
    Si c'est dans le même thread, l'émission d'un signal entraîne l'appel immédiat du slot.

    Mais bon, au final, les signaux/slots c'est juste une bonne implé du pattern observateur. Une alternative indépendante de Qt et l'utilisation de la libsig++ qui est basée sur des templates au lieu de macros. Mais ça ne t'aidera pas des masses.

    Si tu veux mon conseil et que tu veux garder SDL pour la gestion d'événements, utilisent une lib réseau plus légère (genre RakNet) qui ne rajoute pas des dépendances à Qt qui sont sans doute bloated pour ton cas.
    Par contre si tu peux n'utiliser la SDL que pour le dessin, alors tu peux utiliser Qt pour la gestion d'événements sans soucis.
    Tout dépend où tu en es, des contraintes que tu as etc...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut
    En fait, j'ai cherché plusieurs moteurs réseau (relativement) bas niveau
    et multi-plateforme, RakNet est en anglais y compris les documents sur le net
    alors que Qt j'ai acheté un bouquin en français (Qt4 et C++) et j'ai été
    remarquablement surpris par la simplicité de mettre en place des applications
    utilisant des sockets.
    Apparemment le plus simple serait de fondre les evenements SDL dans le gestionnaire de Qt qui est plus puissant (à première vue...)

    Mais dans ces cas là, pourquoi ne pas réecrire le dessin + gestion des evenements à l'aide de Qt et garder SDL pour le son uniquement... ?
    Qt est suffisant pour:
    charger des images (.png pour la plupart)
    dessiner des rectangles de sprites dans des spritesheets ?
    gérer les I/O clavier ?
    Dans ces cas là, ça peut etre une idée de tout passer en Qt...

    J'ai cherché des documents pour construire un moteur réseau de 0
    ils sont tous en anglais, quand des jeux s'y sont attelés ils étaient en C
    ou alors ils n'étaient pas multiplateforme...

    Si tu connais un moteur réseau léger, où l'on peut construire une
    surcouche pas trop lourde (=> convenant à un jeu 2D simple) et
    surtout une doc+tutos en français je suis preneur

    Ou alors, tu considères que RakNet est un bon moteur et que tu as
    des tutos dessus je veux bien essayer.

  6. #6
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Si t'es mal avec l'anglais, même Qt ça va être dur... Comme tout ce qui est en prog, ne pas connaître l'anglais est un trèèèès lourd handicap :/

    Tout ce que tu veux est possible avec Qt. Même le son si tu utilises la version 4.4 (un de ses snapshots plus exactement puisque non releasé à cette heure). Cette version apporte le support phonon qui gère les flux sons et vidéos avec différent backends (gstreamer etc...).

    Par contre j'ai pas de tutos RakNet FR à te filer. (Faut dire que je ne cherche presque jamais en français )

    Edit: selon où tu en es de ton projet, tu peux toujours garder le rendu graphique en SDL... et virer tout ce qui est événement pour passer la main à Qt à ce niveau.
    Bref, des solutions, y'en a, y'a que toi qui peut savoir la meilleure

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut
    Aurais-tu des tutos (clairs et concis) pour RakNet en anglais ?


    J'ai regardé leur site, téléchargé le package et compilé
    avec Codeblocks.

    Cependant je peine à compiler un programme bateau.
    Les fichiers de projet des samples sont tous pour VC++.

    J'ai inclus le dossier "source".
    et pour le linker j'ai indiqué le dossier "lib"
    Il manque peut-être une commande pour le linker genre -lRaknet
    mais je ne trouve pas la commande :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #include <stdio.h>
    #include "RakNetworkFactory.h"
    #include "RakPeerInterface.h"
     
    #define MAX_CLIENTS 10
    #define SERVER_PORT 60000
     
    int main(void)
    {
    	char str[512];
    	RakPeerInterface *peer = RakNetworkFactory::GetRakPeerInterface();
    	bool isServer;
     
    	printf("(C) or (S)erver?\n");
    	gets(str);
    	if ((str[0]=='c')||(str[0]=='C'))
    	{
    		peer->Startup(1,30,&SocketDescriptor(), 1);
    		isServer = false;
    	} else {
    		peer->Startup(MAX_CLIENTS, 30, &SocketDescriptor(SERVER_PORT,0), 1);
    		isServer = true;
    	}
     
     
    	// TODO - Add code body here
     
    	RakNetworkFactory::DestroyRakPeerInterface(peer);
     
    	return 0;
    }
    Edit:
    La solution étant tout simplement de faire pointer:
    - Les inclusions sur le dossier sources (les .cpp + .hpp) du dossier Raknet.
    - Les lib sur lib/DLL/release (là où ça compile en gros...) tjr du dossier Raknet.
    ensuite on compile en ajoutant la mention libRakNet
    ou dans un compilo: -llibRaknet (2 'L')

  8. #8
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Ca devient franchement HS au niveau de la cat là

    Bon, pour commencer, il va te falloir recompiler RakNet car comme tu l'as constaté la version compilée correspond à VS. La façon la plus simple de le faire est de passer par cmake vu qu'un projet est fourni (CMakeList.txt).

    Pour le tuto, tu peux jeter un oeil à celui-ci qui montre l'intégration à IrrLicht (moteur 3D). Tu as juste à ignorer tout ce qui est spécifique à IrrLicht.

    Sinon, je viens de me rappeller d'une petite lib qui pourrait bien faire ton bonheur (tutos dispo en VF sur le site et libs fournie d'office pour mingw ): c'est la SFML. Je te conseillerais de partir sur celle-ci plutôt que RakNet puisque ton projet est modeste comme tu l'as dit au-dessus

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut
    J'ai tenté SDL_Net, puis SFML puis Qt... puis Raknet il va bien falloir que je m'arrete...
    je viens de compiler les sources avec le projet codeblocks mais
    comme tu le dis mes questions deviennent franchement HS.
    Le seul soucis est que il n'y a pas de fora Raknet sur developpez.com
    et c'est bien dommage, un forum pour les moteurs réseaux au moins aurait
    été apprécié je pense, vu la rareté de doc qui est surement du au niveau
    de technique...

    Bref, tout ça pour dire je pense que je vais poursuivre sur Raknet en
    étudiant les samples, de toutes manières je n'ai pas d'échéance, j'apprend
    parce que ça me plait...

    Pour finir sur Raknet, j'ai réussi à compiler les sources pour produire une DLL.
    J'ai réussi à compiler un fichier source simple, tout n'était qu'une histoire de
    linker (comme bien souvent en fait...).
    Si tu as déjà réussi à compiler (sur plateforme win32 je précise) Raknet
    pour produire des .lib et .a statiques ça m'intéresse (juste de la curiosité).

    Merci beaucoup d'avoir répondu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [macOS] Problème de compilation d'un projet SDL et Qt sur Mac OS X 10.6
    Par mak972 dans le forum Plateformes
    Réponses: 2
    Dernier message: 23/02/2010, 23h07
  2. Compilation d'un projet avec du Gtk et SDL
    Par leousch dans le forum C
    Réponses: 1
    Dernier message: 21/05/2009, 19h13
  3. compiler un projet SDL : undefined reference
    Par momeftah dans le forum Dev-C++
    Réponses: 3
    Dernier message: 19/03/2009, 13h18
  4. Compilation SDL & module Qt
    Par LeFlou dans le forum SDL
    Réponses: 3
    Dernier message: 05/03/2008, 17h08
  5. {SDL} compilation projet SDL sous windows.
    Par LeFlou dans le forum SDL
    Réponses: 12
    Dernier message: 14/11/2007, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo