mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-04 11:10:15 +00:00
219 lines
8.5 KiB
Text
219 lines
8.5 KiB
Text
|
Glut alors!
|
|||
|
|
|||
|
Par Jean-Seb le vendredi 10 juillet 2009, 00:18
|
|||
|
|
|||
|
|
|||
|
Freeglut est une <20>volution open-source de Glut.
|
|||
|
Sous Windows, on peut l'utiliser avec Cygwin.
|
|||
|
Facile ? Oui, si on accepte de distribuer "cygwin1.dll"
|
|||
|
Aidons Freeglut <20> conqu<71>rir son ind<6E>pendance !
|
|||
|
m.<2E>.j 10/7/2009 : g<>n<EFBFBD>ration d'une librairie pour linker depuis la dll.
|
|||
|
|
|||
|
|
|||
|
R<EFBFBD>cup<EFBFBD>ration des sources
|
|||
|
|
|||
|
* Reprenez les sources de la version 2.6.0 qui int<6E>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<70>f<EFBFBD>rable <20> la branche 2.4-stable, de
|
|||
|
nombreux bugs <20>tant corrig<69>s.
|
|||
|
* Vous trouverez les sources sur le site de Freeglut:
|
|||
|
o http://freeglut.sourceforge.net/
|
|||
|
|
|||
|
|
|||
|
Principe
|
|||
|
Objectif
|
|||
|
|
|||
|
* Nous allons cr<63>er une dll li<6C>e <20> Cygwin, et une biblioth<74>que statique
|
|||
|
ind<6E>pendante
|
|||
|
* Nous cr<63>erons <20>galement une librairie dynamique, permettant de linker avec
|
|||
|
la dll.
|
|||
|
|
|||
|
Liste des fichiers g<>n<EFBFBD>r<EFBFBD>s
|
|||
|
|
|||
|
* freeglut.dll : une dll classique pour le linkage dynamique.
|
|||
|
* libfreeglut.a : la biblioth<74>que statique. Le programme final est autonome
|
|||
|
(du moins pour OpenGL).
|
|||
|
* libfreeglutdll.a : la biblioth<74>que dynamique. Le programme final a besoin
|
|||
|
de freeglut.dll.
|
|||
|
|
|||
|
|
|||
|
Pr<EFBFBD>paration
|
|||
|
|
|||
|
* D<>pliez l'archive freeglut.
|
|||
|
* Allez dans le r<>pertoire src (situ<74> <20> la racine du r<>pertoire Freeglut),
|
|||
|
et cr<63>ez un sous-r<>pertoire "Gl"
|
|||
|
o Dans ce sous-r<>pertoire, copiez les fichiers du r<>pertoire
|
|||
|
"include/Gl"
|
|||
|
|
|||
|
* Pourquoi faut-il cr<63>er un r<>pertoire "Gl" pour la compilation ?
|
|||
|
o C'<27>tait juste pour simplifier les choses lors de mes essais.
|
|||
|
o Sinon vous pouvez cr<63>er directement les r<>pertoires, et copier les
|
|||
|
fichiers comme indiqu<71> au point installation (lire plus loin).
|
|||
|
|
|||
|
* Faites un peu de m<>nage dans /lib :
|
|||
|
o Effacez toutes les r<>f<EFBFBD>rences <20> la glut, pour ne pas avoir de
|
|||
|
conflit au linkage.
|
|||
|
o Cette <20>tape est facultative, vous pouvez <20>galement choisir de ne
|
|||
|
faire le m<>nage qu' apr<70>s une compilation r<>ussie de Freeglut.
|
|||
|
o Attention <20> ne pas effacer, dans un enthousiasme r<>dempteur, la
|
|||
|
biblioth<74>que glu32.lib (<28> 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<6C>e <20> 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<74>que statique ind<6E>pendante de cygwin
|
|||
|
ar cr lib$(libname).a $(objs)
|
|||
|
#pas forc<72>ment obligatoire (cr<63>ation d'un index pour acc<63>l<EFBFBD>rer les acc<63>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<63>e une dll, une biblioth<74>que statique (une archive, en
|
|||
|
d'autres termes) et la biblioth<74>que dynamique qui permettra l'utilisation
|
|||
|
de la dll.
|
|||
|
|
|||
|
* Ne cherchez pas <20> stripper la biblioth<74>que statique! Vous ne pourriez plus
|
|||
|
compiler en statique.
|
|||
|
o Par contre, vous pouvez stripper l'ex<65>cutable final obtenu lors de
|
|||
|
la compilation de votre application.
|
|||
|
|
|||
|
* J'ai choisi d'appeller la dll et les biblioth<74>ques par leurs "vrais noms":
|
|||
|
freeglut.dll libfreeglutdll.a et libfreeglut.a.
|
|||
|
o Le script configure recr<63>ait (pour des raisons de compatibilit<69> avec
|
|||
|
l'ancienne biblioth<74>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<69> d'appeller les
|
|||
|
choses par leur nom, afin d'<27>viter les confusions.
|
|||
|
o Rien ne vous emp<6D>che de renommer la dll, si vous avez besoin
|
|||
|
d'utiliser des programmes Glut que vous ne pouvez pas recompiler.
|
|||
|
|
|||
|
* La biblioth<74>que dynamique est g<>n<EFBFBD>r<EFBFBD>e <20> partir de la dll.
|
|||
|
o Par souci de concision, j'ai utilis<69> awk. Il g<>n<EFBFBD>re le fichier
|
|||
|
d'exports utilis<69> par dlltool.
|
|||
|
o La seule chose notable est la s<>lection des fonctions dont le nom
|
|||
|
commence par _glut, afin d'<27>viter d'inclure dans la librairie
|
|||
|
dynamique des fonctions sans rapport avec freeglut.
|
|||
|
o ensuite, on utilise dlltool de fa<66>on tr<74>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 <20>ventuellement besoin d'<27>craser d'anciens fichiers
|
|||
|
include, correspondants <20> Glut, si vous l'avez install<6C> avec Cygwin.
|
|||
|
|
|||
|
|
|||
|
Utilisation de la librairie
|
|||
|
|
|||
|
* Nous allons tester avec le programme shapes, pr<70>sent dans
|
|||
|
progs/demos/shapes
|
|||
|
o -mno-cygwin sert <20> forcer l'utilisation de Mingw sans la grosse
|
|||
|
d<>pendance cygwin1.dll.
|
|||
|
o -mwindows sert uniquement <20> enlever l'horrible fen<65>tre shell (tr<74>s
|
|||
|
utile pour la mise au point, par contre).
|
|||
|
o -L. (notez le point apr<70>s le "L") : j'ai laiss<73> 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 <20> obtenir la bonne d<>coration des noms de fonctions dans les
|
|||
|
imports de la lib Freeglut.
|
|||
|
o Vous pouvez essayer sans et prendre un <20>diteur hexa pour voir les
|
|||
|
diff<66>rences dans l'objet.
|
|||
|
* attention <20> l'ordre des biblioth<74>ques : -lfreeglut (statique) doit se
|
|||
|
trouver avant la d<>claration des biblioth<74>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<74>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<6E> uniquement pour r<>f<EFBFBD>rence, le th<74>me de ce billet <20>tant de se d<>barrasser de Cygwin.
|
|||
|
o Disons que <20>a peut servir pendant la mise au point (et encore).
|
|||
|
|
|||
|
* gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut
|
|||
|
|
|||
|
|
|||
|
|
|||
|
O<EFBFBD> sont les dooooocs ?
|
|||
|
|
|||
|
* Freeglut est livr<76> avec sa documentation, plus tr<74>s <20> jour.
|
|||
|
o Il semble qu'il y ait un probl<62>me avec la doc Glut originale. Non
|
|||
|
seulement elle ne correspond pas forc<72>ment au fonctionnement de
|
|||
|
Freeglut, mais de plus, son auteur (Mark Kilgard) l'a copyright<68>. Sa
|
|||
|
distribution est donc difficile.
|
|||
|
|
|||
|
* Jocelyn Fr<46>chot a entrepris une mise <20> 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<72>cu ...
|
|||
|
|
|||
|
* J'ai <20>galement test<73> la recompilation des d<>mos de la lib Glut originelle
|
|||
|
(paix <20> ses cendres).
|
|||
|
o Rien de particulier <20> signaler.
|
|||
|
|
|||
|
* Merci <20> tous les mainteneurs courageux de Freeglut, qu'on croyait mort,
|
|||
|
mais qui bouge encore.
|