Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [QSFMLCanvas] Erreur de compilation  (Lu 4569 fois)

0 Membres et 1 Invité sur ce sujet

Flavi-1

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
[QSFMLCanvas] Erreur de compilation
« le: Février 25, 2013, 01:00:26 pm »
Bonjour à tous,

Je suis en train de créer un éditeur pour mon petit projet de jeu, et pour cela j'ai voulu coupler SFML 2.0 avec Qt 5.0.1.

Seulement, j'ai déjà un problème de compilation avec un code qui devrait en théorie fonctionner:

QSFMLCanvas.hpp
   
#ifndef QSFMLCANVAS_HPP
#define QSFMLCANVAS_HPP
 
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Graphics.hpp>
#include <qwidget.h>
#include <qtimer.h>
 
 
////////////////////////////////////////////////////////////
/// QSFMLCanvas allows to run SFML in a Qt control
////////////////////////////////////////////////////////////
class QSFMLCanvas : public QWidget, public sf::RenderWindow
{
public :
 
    ////////////////////////////////////////////////////////////
    /// Construct the QSFMLCanvas
    ///
    /// \param Parent :    Parent of the widget
    /// \param Position :  Position of the widget
    /// \param Size :      Size of the widget
    /// \param FrameTime : Frame duration, in milliseconds (0 by default)
    ///
    ////////////////////////////////////////////////////////////
    QSFMLCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime = 0);
 
    ////////////////////////////////////////////////////////////
    /// Destructor
    ///
    ////////////////////////////////////////////////////////////
    virtual ~QSFMLCanvas();
 
private :
 
    ////////////////////////////////////////////////////////////
    /// Notification for the derived class that moment is good
    /// for doing initializations
    ///
    ////////////////////////////////////////////////////////////
    virtual void onInit();
 
    ////////////////////////////////////////////////////////////
    /// Notification for the derived class that moment is good
    /// for doing its update and drawing stuff
    ///
    ////////////////////////////////////////////////////////////
    virtual void onUpdate();
 
    ////////////////////////////////////////////////////////////
    /// Return the paint engine used by the widget to draw itself
    ///
    ////////////////////////////////////////////////////////////
    virtual QPaintEngine* paintEngine() const;
 
    ////////////////////////////////////////////////////////////
    /// Called when the widget is shown ;
    /// we use it to initialize our SFML window
    ///
    ////////////////////////////////////////////////////////////
    virtual void showEvent(QShowEvent*);
 
    ////////////////////////////////////////////////////////////
    /// Called when the widget needs to be painted ;
    /// we use it to display a new frame
    ///
    ////////////////////////////////////////////////////////////
    virtual void paintEvent(QPaintEvent*);
 
    ////////////////////////////////////////////////////////////
    // Member data
    ////////////////////////////////////////////////////////////
    QTimer myTimer;       ///< Timer used to update the view
    bool   myInitialized; ///< Tell whether the SFML window has been initialized or not
};
 
 
#endif // QSFMLCANVAS_HPP

QSFMLCanvas.cpp

////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "QSFMLCanvas.hpp"
 
// Platform-specific headers
#ifdef Q_WS_X11
    #include <Qt/qx11info_x11.h>
    #include <X11/Xlib.h>
#endif
 
 
////////////////////////////////////////////////////////////
/// Construct the QSFMLCanvas
////////////////////////////////////////////////////////////
QSFMLCanvas::QSFMLCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime) :
QWidget       (Parent),
myInitialized (false)
{
    // Setup some states to allow direct rendering into the widget
    setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_OpaquePaintEvent);
    setAttribute(Qt::WA_NoSystemBackground);
 
    // Set strong focus to enable keyboard events to be received
    setFocusPolicy(Qt::StrongFocus);
 
    // Setup the widget geometry
    move(Position);
    resize(Size);
 
    // Setup the timer
    myTimer.setInterval(FrameTime);
}
 
 
////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////
QSFMLCanvas::~QSFMLCanvas()
{
    // Nothing to do...
}
 
 
////////////////////////////////////////////////////////////
/// Notification for the derived class that moment is good
/// for doing initializations
////////////////////////////////////////////////////////////
void QSFMLCanvas::onInit()
{
    // Nothing to do by default...
}
 
 
////////////////////////////////////////////////////////////
/// Notification for the derived class that moment is good
/// for doing its update and drawing stuff
////////////////////////////////////////////////////////////
void QSFMLCanvas::onUpdate()
{
    // Nothing to do by default...
}
 
 
////////////////////////////////////////////////////////////
/// Return the paint engine used by the widget to draw itself
////////////////////////////////////////////////////////////
QPaintEngine* QSFMLCanvas::paintEngine() const
{
    return 0;
}
 
 
////////////////////////////////////////////////////////////
/// Called when the widget is shown ;
/// we use it to initialize our SFML window
////////////////////////////////////////////////////////////
void QSFMLCanvas::showEvent(QShowEvent*)
{
    if (!myInitialized)
    {
        // Under X11, we need to flush the commands sent to the server to ensure that
        // SFML will get an updated view of the windows
        #ifdef Q_WS_X11
            XFlush(QX11Info::display());
        #endif
 
        // Create the SFML window with the widget handle
        // The qualification is needed because QWidget::create also exists
        RenderWindow::create(winId());
 
        // Let the derived class do its specific stuff
        onInit();
 
        // Setup the timer to trigger a refresh at specified framerate
        connect(&myTimer, SIGNAL(timeout()), this, SLOT(repaint()));
        myTimer.start();
 
        myInitialized = true;
    }
}
 
 
////////////////////////////////////////////////////////////
/// Called when the widget needs to be painted ;
/// we use it to display a new frame
////////////////////////////////////////////////////////////
void QSFMLCanvas::paintEvent(QPaintEvent*)
{
    // Let the derived class do its specific stuff
    onUpdate();
 
    // Display on screen
    display();
}

Avec ce code le charmant compilateur me transmet ce message, tout en finesse:
   
11:01:04: Exécution des étapes pour le projet AAAAAAEditor...
11:01:04: Configuration inchangée, étape QMake sautée.
11:01:04: Débute : "D:\Qt\Tools\MinGW\bin\mingw32-make.exe"
D:/Qt/Tools/MinGW/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'D:/ProjetsC++/AAAAAAEditor-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug'
g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -DQT_NEEDS_QMAIN -I..\AAAAAAEditor -I"C:\SFML\SFML-2.0\include" -I"..\..\Qt\5.0.1\mingw47_32\include" -I"..\..\Qt\5.0.1\mingw47_32\include\QtWidgets" -I"..\..\Qt\5.0.1\mingw47_32\include\QtGui" -I"..\..\Qt\5.0.1\mingw47_32\include\QtCore" -I"debug" -I"." -I"." -I"..\..\Qt\5.0.1\mingw47_32\mkspecs\win32-g++" -o debug\QSFMLCanvas.o ..\AAAAAAEditor\QSFMLCanvas.cpp
..\AAAAAAEditor\QSFMLCanvas.cpp: In member function 'virtual void QSFMLCanvas::showEvent(QShowEvent*)':
..\AAAAAAEditor\QSFMLCanvas.cpp:91:37: error: invalid conversion from 'WId {aka unsigned int}' to 'sf::WindowHandle {aka HWND__*}' [-fpermissive]
In file included from C:\SFML\SFML-2.0\include/SFML/Window.hpp:40:0,
                 from C:\SFML\SFML-2.0\include/SFML/Graphics.hpp:32,
                 from ..\AAAAAAEditor\QSFMLCanvas.hpp:7,
                 from ..\AAAAAAEditor\QSFMLCanvas.cpp:4:
C:\SFML\SFML-2.0\include/SFML/Window/Window.hpp:141:10: error:   initializing argument 1 of 'void sf::Window::create(sf::WindowHandle, const sf::ContextSettings&)' [-fpermissive]
Makefile.Debug:844: recipe for target 'debug/QSFMLCanvas.o' failed
mingw32-make[1]: *** [debug/QSFMLCanvas.o] Error 1
mingw32-make[1]: Leaving directory 'D:/ProjetsC++/AAAAAAEditor-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug'
makefile:34: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2
11:01:07: Le processus "D:\Qt\Tools\MinGW\bin\mingw32-make.exe" s'est terminé avec le code 2.
Error while building/deploying project AAAAAAEditor (kit: Desktop Qt 5.0.1 MinGW 32bit)
Lors de l'exécution de l'étape "Make"

Voilà, il me semble que toutes les informations à ma connaissance sont là.

Est-ce que vous sauriez comment résoudre cette erreur?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #1 le: Février 25, 2013, 01:45:17 pm »
A priori ceci devrait suffire :

sf::RenderWindow::create(static_cast<sf::WindowHandle>(winId()));

Si static_cast ne passe pas, essaye avec reinterpret_cast. Mais c'est vraiment bizarre que WId soit unsigned int sous Windows. C'est pas logique.
Laurent Gomila - SFML developer

Flavi-1

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #2 le: Février 25, 2013, 02:30:52 pm »
Le reinterpret_cast fonctionne!

Mais maintenant j'ai droit à une autre erreur:

Démarrage de D:\ProjetsC++\AAAAAAEditor-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug\debug\AAAAAAEditor.exe...Le programme s'est terminé subitement.
D:\ProjetsC++\AAAAAAEditor-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug\debug\AAAAAAEditor.exe a quitté avec le code -1073741515

Mon .pro, parce que c'est peut-être de là que ça vient:

#-------------------------------------------------
#
# Project created by QtCreator 2013-02-22T19:05:10
#
#-------------------------------------------------

QT       += core gui

TARGET = AAAAAAEditor
TEMPLATE = app


SOURCES += main.cpp\
        MainWindow.cpp \
    QSFMLCanvas.cpp

HEADERS  += MainWindow.hpp \
    QSFMLCanvas.hpp

INCLUDEPATH += C:\SFML\SFML-2.0\include\

LIBS += C:\SFML\SFML-2.0\lib\libsfml-system.a \
    C:\SFML\SFML-2.0\lib\libsfml-window.a \
    C:\SFML\SFML-2.0\lib\libsfml-graphics.a \
    C:\SFML\SFML-2.0\lib\libsfml-audio.a \
    C:\SFML\SFML-2.0\lib\libsfml-network.a

FORMS += mainwindow.ui

 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #3 le: Février 25, 2013, 02:37:48 pm »
Il faut lier aux bibiothèques debug en debug, il ne faut jamais mélanger les configurations. Et ton .pro peut être amélioré.

LIBS += -LC:/SFML/SFML-2.0/lib

CONFIG(release, debug|release)
{
    LIBS += -lsfml-audio -lsfml-graphics -lsfml-network -lsfml-system -lsfml-window
}
CONFIG(debug, debug|release)
{
    LIBS += -lsfml-audio-d -lsfml-graphics-d -lsfml-network-d -lsfml-system-d -lsfml-window-d
}

Si ça ne règle pas ton problème pense à utiliser ton debugger. C'est fait pour ça.
Laurent Gomila - SFML developer

Flavi-1

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #4 le: Février 25, 2013, 04:24:40 pm »
Ca ne change rien, et le debugger ne se lance pas:

Echec de l'exécutable
During startup program exited vith code 0xc0000135.

J'imagine qu'il s'agit d'un problème de link, mais je ne vois pas comment y remédier  :(

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #5 le: Février 25, 2013, 04:27:30 pm »
Un problème d'édition de liens surviendrait à... l'édition de liens, pas au lancement du programme.

Tu es sûr que ce n'est pas un problème de DLL manquante ? Il se passe quoi si tu lances l'exécutable depuis l'explorateur Windows, plutôt que depuis QtCreator ? Parfois les messages d'erreur de ce dernier sont un peu moisis dans ce genre de situation.
Laurent Gomila - SFML developer

Flavi-1

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #6 le: Février 25, 2013, 07:48:09 pm »
Un problème d'édition de liens surviendrait à... l'édition de liens, pas au lancement du programme.
Oui, je sais, je ne suis pas un grand spécialiste, mais je ne demande qu'à apprendre  :) .

J'ai résolu le problème en partie en mettant les dll de Qt dans le dossier en plus de celles de la SFML, je n'ai jamais eu le faire, mais il y a un début à tout  :D .
Je dis en partie, parce que lorsque je lance le programme à partir de Qt Creator, ça fonctionne parfaitement, mais ça ouvre une boite de dialogue (avec une très grosse croix  :( ) qui dit:

Microsoft Visual C++ Runtime Library

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Donc dans la mesure où l'application devrait être utilisée autre part qu'avec l'IDE, le problème n'est pas encore entièrement résolu.

Flavi-1

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #7 le: Février 26, 2013, 11:44:04 am »
Bon en fin de compte je vais utiliser un éditeur déjà existant, et plus tard j'en ferai un en Qt pure, et je garderai la SFML pour la partie "intéressante" du jeu.

En tous cas merci pour votre aide!

elmgignac

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #8 le: Avril 26, 2013, 10:13:51 am »
Bonjour à tous,
Je suis débutant en SFML, j'ai donc utilisé ce tuto http://www.sfml-dev.org/tutorials/1.6/graphics-qt-fr.php  pour commencer à comprendre mais j'ai le problème sus-cité sur la conversion "WID {aka unsigned int} to sh::WindowHandle {aka void*}"
j'ai donc essayé les 2 solutions proposées mais  le compilateur me retourne une nouvelle erreur de type "undefined reference to 'sf::Window::Display()'

Seriez-vous d'où elle vient et comment la régler ?
Merci d'avance.

lepiaff

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : [QSFMLCanvas] Erreur de compilation
« Réponse #9 le: Avril 27, 2013, 01:39:20 am »
Personnellement, j'ai tout essayé...
sfml1.6 avec qt 4.8.4 sous mingw4.4 et le tuto dédié, ça ne marche pas(Je soupçonne le problème avec ma carte graphique amd).
sfml2.0 recompilée sous mingw4.7.2 avec qt 5.0.2 sous mingw4.7.2 et le tuto remanié que j'ai trouvé sur le net, idem. Problème de conversion de l'id et d'autres choses encore.

J'ai essayé de bidouiller mais rien n'y fait, je suis découragé. D'autant plus que je vois des posts de gens qui disent qu'ils arrivent à afficher la fenêtre. Bref
« Modifié: Avril 27, 2013, 01:44:10 am par lepiaff »