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

Auteur Sujet: Problème avec GLEW en static  (Lu 4176 fois)

0 Membres et 1 Invité sur ce sujet

Wimoh

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Problème avec GLEW en static
« le: Août 05, 2012, 12:28:52 pm »
Bonjour,

C'est la première fois que je viens sur ce forum alors je dois d'abords dire que j'adore le code SFML pour ouvrir une fenêtre.  ;D

J'ai suivi le tuto pour compiler le SFML en static et tout c'est bien passé (c'est bien expliqué pour ceux qui trouvent le linkage compliqué en c++, comme moi   :-\ et j'ai appris quelques trucs au passage  :D ).
Puis j'ai compilé un autre code indépendant de la SFML avec le dernier GLEW fraichement téléchargé, tout ce passe bien.
Ensuite j'ai essayé de combiner les deux... et là c'est le drame.

J'ai des erreurs en essayant de compiler SFML et GLEW en static avec code::blocks
J'utilise :
   - les define SFML_STATIC et GLEW_STATIC
   - j'ai mis le glew.c dans mon projet et renommé glew.h dans Mingw (pour être sûr d'utiliser le bon)
   - j'ai ajouté "opengl32" et "glu32" en dessous des options de link sfml static

Le code très basique:
#include <SFML/Graphics.hpp>
#include <GL/glew.h>

int main()
{
    sf::RenderWindow window(sf::VideoMode(300, 200), "SFML works!");
    sf::Text text("Hello SFML");

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(text);
        window.display();
    }

    return 0;
}
 

Les erreurs:
-------------- Build: Release in sfml_opengl (compiler: GNU GCC Compiler)---------------

Compiling: glew.c
cc1.exe: attention : command line option '-std=c++0x' is valid for C++/ObjC++ but not for C [enabled by default]
Compiling: sfml_opengl.cpp
Linking executable: bin\Release\sfml_test.exe
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd78): multiple definition of `__glewWindowPos2dARB'
obj\Release\glew.o:glew.c:(.bss+0x15e0): first defined here
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd7c): multiple definition of `__glewWindowPos2dvARB'
obj\Release\glew.o:glew.c:(.bss+0x15dc): first defined here
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd80): multiple definition of `__glewWindowPos2fARB'
obj\Release\glew.o:glew.c:(.bss+0x15d8): first defined here
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd84): multiple definition of `__glewWindowPos2fvARB'
obj\Release\glew.o:glew.c:(.bss+0x15d4): first defined here
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd88): multiple definition of `__glewWindowPos2iARB'
obj\Release\glew.o:glew.c:(.bss+0x15d0): first defined here
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd8c): multiple definition of `__glewWindowPos2ivARB'
obj\Release\glew.o:glew.c:(.bss+0x15cc): first defined here
C:\sfml_2_0\lib/libsfml-graphics-s.a(glew.c.o):glew.c:(.bss+0xd90): multiple definition of `__glewWindowPos2sARB'
obj\Release\glew.o:glew.c:(.bss+0x15c8): first defined here
 

Je met pas tout c'est comme ça sur toute les fonctions du fichier glew.c

Je pense que la sfml ne prend pas mon fichier glew.c mais elle ne peut pas prendre celui de Mingw, alors elle possède le sien j'imagine.
Comment éviter ce conflit ?

Je vais avoir besoin de définir ça avant le glewInit() (que j'imagine donc être quelque part dans la SFML) :
glewExperimental = GL_TRUE;
 

Est-ce possible sans bidouiller-recompiler la SFML ?

EDIT: désolé j'avais pas vu la section aide->général sur le forum
« Modifié: Août 05, 2012, 12:57:27 pm par Wimoh »

Lynix

  • Sr. Member
  • ****
  • Messages: 403
    • Voir le profil
Re : Problème avec GLEW en static
« Réponse #1 le: Août 05, 2012, 02:05:09 pm »
La SFML inclut déjà GLEW dans sa bibliothèque, en statique, et si tu l'inclus toi aussi en statique alors il y a collision dans le programme.

La solution la plus simple : Utiliser GLEW en dynamique :)

Ou alors peut-être que tu peux utiliser le GLEW inclus dans la SFML, ça fait quoi si tu ne link pas GLEW mais que tu utilises quand même ses headers ?

Wimoh

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Problème avec GLEW en static
« Réponse #2 le: Août 05, 2012, 05:53:16 pm »
Merci pour ton aide.

Je vais me renseigner sur la compilation dynamique en c++, j'avoue que j'y connais pas grand chose à par le principe général.


Wimoh

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Problème avec GLEW en static
« Réponse #3 le: Août 07, 2012, 12:56:07 am »
Je suis sous Windows 7 64, j'utilise le dernier mingw + code::blocks, le dernier glew, opengl constext 4.2

J'ai finalement réussi à faire des compilations dynamiques, résultats:
     - sfml static & new_glew static => compile pas comme dis plus haut
     - sfml static & new_glew dynamic => crash sans explication
     - sfml dynamic & new_glew dynamic => crash sans explication
     - sfml dynamic & new_glew static => crash sans explication
     - sfml  sans new_glew mais avec mon code gl => compile pas

A chaque fois ça compile sans faire d'histoire et ça crash.
J'imagine que les deux glew entre en conflit au chargement des .dll. Comme ça passe pas en static, ça plante en dynamique?
Je suis pas une star du debugger gbd mais bon je peux quand même appuyer sur la flèche rouge  ::)
ça me dis segment fault .. avec un kernell32 qui traine...

Est-ce que ferais pas mieux de bidouiller la sfml pour utiliser le glew dont j'ai besoin? J'ai pas loupé quelque chose? C'est normal que la lib glew dans sfml interagisse comme ça avec mon code  :'( ?

Wimoh

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Problème avec GLEW en static
« Réponse #4 le: Août 07, 2012, 12:47:32 pm »
J'ai fini par trouver tout seul ! 8)
Qu'est-ce qu'on en apprend des choses à chercher tout seul ! ;D

J'ai appris à compiler de toutes les façons tordues possibles alors que ça n'avait aucun rapport avec mon problème  ::)

J'avais fais l'hypothèse -fausse- que la classe sf::RenderWindow initialisait glew puisque SFML créer le context OpenGL.
Donc la solution à mon problème:
glewInit();
 

J'ai cru ça parce qu'il faut initialiser glew pour utiliser certaines fonctions OpenGL (d'où mes crashes), une petite parenthèse dans le tuto OpenGL si possible   ::)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème avec GLEW en static
« Réponse #5 le: Août 07, 2012, 01:11:58 pm »
Citer
J'avais fais l'hypothèse -fausse- que la classe sf::RenderWindow initialisait glew puisque SFML créer le context OpenGL.
Il ne faut pas penser de cette manière.
Soit l'interface avec GLEW est une fonctionnalité et dans ce cas c'est très clairement documenté, soit c'est un détail purement interne d'implémentation et dans ce cas ça n'a aucun effet de bord sur l'utilisation qui pourrait être faite de GLEW en dehors de SFML. Evidemment ici on se trouve dans le second cas ;)

Il ne faut jamais rien déduire avec SFML, si quelque chose est public alors c'est quelque part dans la doc ou les tutos. Si ce n'est pas le cas, c'est que tu n'as pas à t'en soucier.
Laurent Gomila - SFML developer