Source

gltut / freeglut-2.6.0 / LISEZMOI.cygwin_mingw

Glut alors!

Par Jean-Seb le vendredi 10 juillet 2009, 00:18


Freeglut est une évolution open-source de Glut.
Sous Windows, on peut l'utiliser avec Cygwin.
Facile ? Oui, si on accepte de distribuer "cygwin1.dll"
Aidons Freeglut ŕ conquérir son indépendance !
m.ŕ.j 10/7/2009 : génération d'une librairie pour linker depuis la dll.


Récupération des sources

    * Reprenez les sources de la version 2.6.0 qui intčgre les changements
      récents.
    * Pour l'instant, il s'agit d'une RC (Release Candidate), mais la version
      finale ne saurait tarder.
    * L'utilisation de la 2.6 est préférable ŕ la branche 2.4-stable, de
      nombreux bugs étant corrigés.
    * Vous trouverez les sources sur le site de Freeglut:
          o http://freeglut.sourceforge.net/


Principe
Objectif

    * Nous allons créer une dll liée ŕ Cygwin, et une bibliothčque statique
      indépendante
    * Nous créerons également une librairie dynamique, permettant de linker avec
      la dll.

Liste des fichiers générés

    * freeglut.dll : une dll classique pour le linkage dynamique.
    * libfreeglut.a : la bibliothčque statique. Le programme final est autonome
      (du moins pour OpenGL).
    * libfreeglutdll.a : la bibliothčque dynamique. Le programme final a besoin
      de freeglut.dll.


Préparation

    * Dépliez l'archive freeglut.
    * Allez dans le répertoire src (situé ŕ la racine du répertoire Freeglut),
      et créez un sous-répertoire "Gl"
          o Dans ce sous-répertoire, copiez les fichiers du répertoire
            "include/Gl"

    * Pourquoi faut-il créer un répertoire "Gl" pour la compilation ?
          o C'était juste pour simplifier les choses lors de mes essais.
          o Sinon vous pouvez créer directement les répertoires, et copier les
            fichiers comme indiqué au point installation (lire plus loin).

    * Faites un peu de ménage dans /lib :
          o Effacez toutes les références ŕ la glut, pour ne pas avoir de
            conflit au linkage.
          o Cette étape est facultative, vous pouvez également choisir de ne
            faire le ménage qu' aprčs une compilation réussie de Freeglut.
          o Attention ŕ ne pas effacer, dans un enthousiasme rédempteur, la
            bibliothčque glu32.lib (ŕ ne pas confondre avec glut32.lib).


Compilation

    * Oubliez le triptyque ./configure , make , make install.
          o Ca ne marche pas du tout avec Cygwin.

    * Voici un Makefile qui fera l'affaire:

#Makefile pour Freeglut 2.6.0-rc et Cygwin
#A placer dans le répertoire "src"

sources=$(wildcard *.c)
objs=$(sources:.c=.o)
libname=freeglut


CFLAGS=-O2 -DTARGET_HOST_MS_WINDOWS -DX_DISPLAY_MISSING -DFREEGLUT_STATIC -I./
LDFLAGS=-lopengl32 -lgdi32 -lwinmm

nocyg=-mno-cygwin -mwindows

all: $(objs)
        #construction dll liée ŕ cygwin1.dll
        gcc $(nocyg) $(objs) -shared $(LDFLAGS) -o $(libname).dll
        nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def
        dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a

        #construction bibliothčque statique indépendante de cygwin
        ar cr lib$(libname).a $(objs)
        #pas forcément obligatoire (création d'un index pour accélérer les accčs)
        ranlib lib$(libname).a

%.o: %.c
        gcc $(nocyg) -c $(CFLAGS) $<

clean:
        rm -f *.o $(libname).dll $(libname).def lib$(libname)dll.a lib$(libname).a




Quelques remarques sur le makefile

    * Ce makefile crée une dll, une bibliothčque statique (une archive, en
      d'autres termes) et la bibliothčque dynamique qui permettra l'utilisation
      de la dll.

    * Ne cherchez pas ŕ stripper la bibliothčque statique! Vous ne pourriez plus
      compiler en statique.
          o Par contre, vous pouvez stripper l'exécutable final obtenu lors de
            la compilation de votre application.

    * J'ai choisi d'appeller la dll et les bibliothčques par leurs "vrais noms":
      freeglut.dll libfreeglutdll.a et libfreeglut.a.
          o Le script configure recréait (pour des raisons de compatibilité avec
            l'ancienne bibliothčque Glut) glut.dll et libglut.a.
          o Lors des mes essais, j'ai eu des conflits avec une authentique
            "glut" qui trainait dans mon "/lib". J'ai décidé d'appeller les
            choses par leur nom, afin d'éviter les confusions.
          o Rien ne vous empęche de renommer la dll, si vous avez besoin
            d'utiliser des programmes Glut que vous ne pouvez pas recompiler.

    * La bibliothčque dynamique est générée ŕ partir de la dll.
          o Par souci de concision, j'ai utilisé awk. Il génčre le fichier
            d'exports utilisé par dlltool.
          o La seule chose notable est la sélection des fonctions dont le nom
            commence par _glut, afin d'éviter d'inclure dans la librairie
            dynamique des fonctions sans rapport avec freeglut.
          o ensuite, on utilise dlltool de façon trčs classique.

nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def
dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a




Installation

    * Copiez libfreeglut.a, libfreeglutdll.a dans le répertoire /lib de Cygwin.
    * Copiez freglut.dll dans le system32 de Windows (ce qui est pratique, mais
      pas propre!).
    * Copiez les fichiers headers de Freeglut (/include/gl) dans /usr/include/Gl
      de Cygwin.
    * Copiez les fichiers headers (toujours /include/gl) dans
      /usr/include/mingw/Gl : ceci sert aux compilations avec le flag
      -mno-cygwin, qui utilise alors les includes de mingw.
          o Vous aurez éventuellement besoin d'écraser d'anciens fichiers
            include, correspondants ŕ Glut, si vous l'avez installé avec Cygwin.


Utilisation de la librairie

    * Nous allons tester avec le programme shapes, présent dans
      progs/demos/shapes
          o -mno-cygwin sert ŕ forcer l'utilisation de Mingw sans la grosse
            dépendance cygwin1.dll.
          o -mwindows sert uniquement ŕ enlever l'horrible fenętre shell (trčs
            utile pour la mise au point, par contre).
          o -L. (notez le point aprčs le "L") : j'ai laissé libfreeglut.a,
            libfreeglutdll.a et freeglut.dll dans le répertoire de test, le
            temps des tests justement.


Compilation en librairie statique freeglut, sans cygwin

    * Toute l'astuce réside dans le define : -DFREEGLUT_STATIC
          o Il sert ŕ obtenir la bonne décoration des noms de fonctions dans les 
            imports de la lib Freeglut.
          o Vous pouvez essayer sans et prendre un éditeur hexa pour voir les
            différences dans l'objet.
    * attention ŕ l'ordre des bibliothčques : -lfreeglut (statique) doit se
      trouver avant la déclaration des bibliothčques dynamiques.

    * gcc shapes.c -L. -lfreeglut -lopengl32 -lwinmm -lgdi32 -mno-cygwin
      -mwindows -DFREEGLUT_STATIC


Compilation avec dll freeglut, sans cygwin

    * Pour le define, męme remarque que ci-dessus
    * L'ordre des bibliothčques n'a plus d'importance.

    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut -mno-cygwin
      -DFREEGLUT_STATIC


Compilation avec dll freeglut, avec Cygwin

    * Cet exemple est donné uniquement pour référence, le thčme de ce billet étant de se débarrasser de Cygwin.
          o Disons que ça peut servir pendant la mise au point (et encore).

    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut



Oů sont les dooooocs ?

    * Freeglut est livré avec sa documentation, plus trčs ŕ jour.
          o Il semble qu'il y ait un problčme avec la doc Glut originale. Non
            seulement elle ne correspond pas forcément au fonctionnement de
            Freeglut, mais de plus, son auteur (Mark Kilgard) l'a copyrighté. Sa
            distribution est donc difficile.

    * Jocelyn Fréchot a entrepris une mise ŕ niveau des docs pour la version
      2.6.0. On peut les trouver sur son site pour l'instant:
          o http://jocelyn.frechot.free.fr/freeglut/


Quelque chose a survécu ...

    * J'ai également testé la recompilation des démos de la lib Glut originelle
      (paix ŕ ses cendres).
          o Rien de particulier ŕ signaler.

    * Merci ŕ tous les mainteneurs courageux de Freeglut, qu'on croyait mort,
      mais qui bouge encore.
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.