Guida alla compilazione con Cygwin di applicativi GUI crossplatform che usano GTK+ v2.8 e Cairo v1.4

[english version (newest - più aggiornata)]


1 - Scaricare Cygwin:
http://cygwin.com/ (testato fino alla 1.5.25-11 del 2008/03/09)

2 - Installare Cygwin. Selezionare almeno le seguenti librerie:
Freetype2
Fontconfig
libpng12
Installare anche il tools devel 'pkg-config'
Chiaramente installare compilatore e make.
Se volete compilare 'anche' per il backend X11 selezionate anche le seguenti librerie:
GTK-2.0
ATK-1.0
PANGO-1.0
GLIB-2.0
CAIRO

3 - Scaricare e installare le GTK+/Win32 Development (sorgenti, include, Glade e pkg-config):
http://gladewin32.sourceforge.net/  (attualmente 2.12.9)
oppure dal mio sito:
Gtk+/Win32 Developement 2.12.9-1 (.exe, 17M)

4 - Dal pannello di controllo di windows, sistema, avanzate, variabili d'ambiente
verificare che le seguenti variabili siano settate a:

DISPLAY=localhost:0

GTK_BASEPATH=C:\Programmi\FILECO~1\GTK\2.0   (ideale)
GTK_BASEPATH=C:\PROGRA~1\FILECO~1\GTK\2.0  (ripiego)
GTK_BASEPATH=%CommonProgramFiles%\GTK\2.0  (lo spazio crea problemi)
GTK_BASEPATH=C:\Programmi\File comuni\GTK\2.0   (lo spazio crea problemi)

LIB=%GTK_BASEPATH%\LIB;   (ideale)
LIB=C:\Programmi\File comuni\GTK\2.0\LIB;     (lo spazio crea problemi)

INCLUDE=
C:\Programmi\File comuni\GTK\2.0\INCLUDE;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\GTK-2.0;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\ATK-1.0;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\PANGO-1.0;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\GLIB-2.0;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\CAIRO;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\LIBGLADE-2.0;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\LIBXML2;
C:\Programmi\File comuni\GTK\2.0\INCLUDE\GTKGLEXT-1.0;
C:\Programmi\File comuni\GTK\2.0\LIB\GTK-2.0\INCLUDE;
C:\Programmi\File comuni\GTK\2.0\LIB\GLIB-2.0\INCLUDE;
C:\Programmi\File comuni\GTK\2.0\LIB\GTKGLEXT-1.0\INCLUDE;

Path=
%SystemRoot%\system32;       (C:\WINDOWS\system32)
%SystemRoot%;                (C:\WINDOWS)
C:\Programmi\cygwin\bin;
%GTK_BASEPATH%\bin;          (C:\Programmi\File comuni\GTK\2.0\bin)
...   (il resto)

5 - Avviare Cygwin Bash e verificare che:
pkg-config --version
riporti la 0.21 minimo.
Infatti Cygwin installa in:
/usr/bin
C:\Programmi\cygwin\usr\bin
la 0.21, mentre GTK+/Win32 Devel installa in:
/cygdrive/c/Programmi/FILECO~1/GTK/2.0/bin/pkg-config
C:\Programmi\File comuni\GTK\2.0/bin/pkg-config
la 0.20, con cui non funziona il --list-all
Eventualmente invertire nel path:
/usr/bin/   e
/cygdrive/c/Programmi/FILECO~1/GTK/2.0/bin/

6 - Perché funzioni pkg-config è necessario inoltre configurare la
variabile di ambiente usata per cercare i file *.pc dei pacchetti
echo $PKG_CONFIG_PATH
Se non già presenti inserirvi:
/cygdrive/c/Programmi/FILECO~1/GTK/2.0/lib/pkgconfig/;
/cygdrive/c/Programmi/cygwin/lib/pkgconfig/
C:\Programmi\File comuni\GTK\2.0\lib\pkgconfig\
C:\Programmi\cygwin\lib\pkgconfig\

7 - Cambiare come segue tutti i file *.pc contenuti in:
$GTK_BASEPATH/lib/pkgconfig
/cygdrive/c/Programmi/File comuni/GTK/2.0/lib/pkgconfig
In ognuno la prima riga riporta:
prefix=/target
sostituire con:
prefix=/cygdrive/c/PROGRA~1/FILECO~1/GTK/2.0
prefix=$GTK_BASEPATH   (usare il valore della variabile e non la variabile stessa).
Per fare prima potete usare questo semplice programmino str2str.c

7b - Copiate il seguente file pixman-1.pc in:
        /cygdrive/c/Programmi/File comuni/GTK/2.0/lib/pkgconfig

8 - Verificare di avere queste versioni di librerie minimo:
PackageName _________________ LastVers Install_ Description____________________

pkg-config __________________ 0.22     0.21

atk _________________________ 1.12.3   1.12.3   Atk - Accessibility Toolkit
cairo _______________________ 1.4.10   1.2.6    cairo - Multi-platform 2D graph
fontconfig __________________ 2.4.2    2.4.2    Fontconfig - Font configuration
freetype2 ___________________ 2.3.5    9.6.3    FreeType 2 - A free, high-quali
gdk-2.0 _____________________ 2.10.11  2.10.11  GDK - GIMP Drawing Kit (win32 t
gdk-pixbuf-2.0 ______________ 2.10.11  2.10.11  GdkPixbuf - Image loading and s
gdk-pixbuf-xlib-2.0 _________ 2.6.10   2.6.10   GdkPixbuf Xlib - GdkPixbuf rend
gdk-x11-2.0 _________________ 2.6.10   2.6.10   GDK - GIMP Drawing Kit (x11 tar
glib-2.0 ____________________ 2.14.0   2.12.11  GLib - C Utility Library
gmodule-2.0 _________________ 2.12.11  2.12.11  GModule - Dynamic module loader
gobject-2.0 _________________ 2.12.11  2.12.11  GObject - GLib Type, Object, Pa
gthread-2.0 _________________ 2.12.11  2.12.11  GThread - Thread support for GL
gtk+-2.0 ____________________ 2.10.14  2.10.11  GTK+ - GIMP Tool Kit (win32 tar
gtk+-x11-2.0 ________________ 2.6.10   2.6.10   GTK+ - GIMP Tool Kit (x11 targe
gtk-doc _____________________ 1.5      1.5      gtk-doc - API documentation gen
gtk-engines-2 _______________ 2.2.0    2.2.0    gtk-engines-2 - GTK+ Theme Engi
libglade-2.0 ________________ 2.5.1    2.5.1    Libglade - a library for dynami
libpng ______________________ 1.2.12   1.2.12   libpng - Loads and saves PNG fi
libpng12 ____________________ 1.2.12   1.2.12   libpng - Loads and saves PNG fi
librsvg-2.0 _________________ 2.14.4   2.14.4   librsvg - library that renders
libxml-2.0 __________________ 2.6.27   2.6.27   libXML - libXML library version
pango _______________________ 1.16.4   1.16.1   Pango - Internationalized text
pangoft2 ____________________ 1.16.1   1.16.1   Pango FT2 - Freetype 2.0 font s
pangox ______________________ 1.8.1    1.8.1    Pango X - X Window System font
pangoxft ____________________ 1.8.1    1.8.1    Pango Xft - Xft font support fo
xcursor _____________________ 1.1.4    1.1.4    Xcursor - X Cursor Library
xft _________________________ 2.1.6    2.1.6    Xft - X FreeType library


9 - provare il package "pkgconfig" con:
     pkg-config --cflags --libs gtk+-2.0
Attenzione che se restituisce una cosa del tipo:

     -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/
include/pango-1.0 -I/usr/X11R6/include -I/usr/include/freetype2 -I/usr/include/g
lib-2.0 -I/usr/lib/glib-2.0/include  -Wl,--export-dynamic -lgtk-x11-2.0 -lgdk-x1
1-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lg
object-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv

  le GTK che verranno usate sono le 2.4 di Cygwin e non le 2.10 di GTK+/Win32 Devel.


10 - Teoricamente ora dovrebbe funzionare la compilazione con
pkg-config --cflags --libs gtk+-2.0
che genera tutte le opzioni di compilazione e linking delle GTK2.
Esempio:

gcc -Wall -o target `pkg-config --cflags --libs gtk+-2.0` target.h target.c main.c


11 - Se non vi funziona pkg-config, un makefile con opzioni sicuramente funzionanti, è:

# pkg-config --cflags gtk+-2.0
cflags = -Wall -mno-cygwin -mms-bitfields \
         -I"$(GTK_BASEPATH)"/include \
         -I"$(GTK_BASEPATH)"/include/gtk-2.0 \
         -I"$(GTK_BASEPATH)"/include/atk-1.0 \
         -I"$(GTK_BASEPATH)"/include/pango-1.0 \
         -I"$(GTK_BASEPATH)"/include/glib-2.0 \
         -I"$(GTK_BASEPATH)"/include/cairo \
         -I"$(GTK_BASEPATH)"/include/freetype2 \
         -I"$(GTK_BASEPATH)"/include/libpng12 \
         -I"$(GTK_BASEPATH)"/lib/gtk-2.0/include \
         -I"$(GTK_BASEPATH)"/lib/glib-2.0/include

# pkg-config --libs gtk+-2.0
ldflags = -user32 -Wl,-luuid -L"$(GTK_BASEPATH)"/lib \
          -lgtk-win32-2.0 -lgdk-win32-2.0 -lgdi32 -limm32 \
          -lshell32 -lole32 -latk-1.0 -lgdk_pixbuf-2.0 \
          -lpangowin32-1.0 -lpangocairo-1.0 -lcairo -lpangoft2-1.0 \
          -lpango-1.0 -lm -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 \
          -lintl -liconv -lfreetype -lz -lfontconfig -lpng12

target: target.o marshallers.o
    gcc target.o marshallers.o -o target $(ldflags)

target.o: target.c
    gcc $(cflags) -c target.c

marshallers.o: marshallers.h marshallers.c
    gcc $(cflags) -c marshallers.c

marshallers.c: marshallers.list
    glib-genmarshal --prefix _marshal --body $< > $@

marshallers.h: marshallers.list
    glib-genmarshal --prefix _marshal --header $< > $@


N.B. Nell'esempio si fa uso di 'glib-genmarshal' che a partire da;
marshallers.list genera marshallers.h e marshallers.c

Ci sono due versioni di glib-genmarshal:
/cygdrive/c/Programmi/FILECO~1/GTK/2.0/bin/glib-genmarshal --version
glib-genmarshal version 2.12.11
e
/usr/bin/glib-genmarshal --version
glib-genmarshal version 2.10.3
usare la più recente.


12 - se volete testare la vostra installazione delle librerie e del compilatore, potete scaricare questo sorgente minimale, ma che usa le Cairo e quindi le GTK+ 2.8. Se vi compila questo, potete essere certi che vi si compileranno anche applicativi complessi. Il comando di compilazione è:
gcc -Wall -O3 -lm cairo.c -o cairo `pkg-config --cflags --libs gtk+-2.0`


Note aggiuntive:
----------------
Per un visual Builder di interfacce a Widget usate Glade (Linux e Win32)

Per un ambiente IDE integrato con l'editor usate Anjuta (solo per Linux)
Per un ambiente IDE integrato con l'editor usate Dev-C++ (solo per Win32)


Note sulla generazione usando Glade:
------------------------------------
Per compilare usando Glade sono richiesti questi altri tools forniti con Cygwin:
autoconf
intltoolize
xml-i18n-toolize
libtool
glib-gettextize
automake
aclocal

Una volta prodotti i sorgenti con il pulsante Build,
portarsi nel direttorio radice del progetto ed eseguire 'autogen.sh' per produrre i Makefile.
Poi lanciare make

N.B. se nel codice si fa uso di ?printf, in src/Makefile è necessario aggiungere a
<projectname>_LDADD (opzioni di link):
 -L/usr/lib/mingw -lmsvcrt
altrimenti non risolve il simbolo '__imp___iob'
Oppure meglio aggiungerlo in Makefile.am alla riga: _LDADD

Per aggiungere delle opzioni di compilazione, aggiungerle in:
Makefile.am una riga AM_CFLAGS =


Note sul contenuto dei files generati da Glade:
-----------------------------------------------
Per aggiungere altri file al progetto, modificare:
Makefile.am nella sezione _SOURCES


Link utili su GTK+, Glade, Cairo, sviluppo crossplatform con GUI

Perchè usare GTK+ v2.8+ e Cairo v1.4+ per lo sviluppo di applicativi crossplatform con GUI

Vai alla pagina EFA programmazione
Torna alla pagina principale:  EFA home page

Web site showed  times since 01/04/2000. 
From 20/10/1999 - 31/03/2000 the counter showed 770 visits, but it was resetted from the provider (so add 770 ...)

Copyright (C) 2006,2007,2008  Valerio Messina http://users.iol.it/efa
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License,
Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts
and no Back-Cover Texts.  A copy of the license is included in the section entitled "GNU Free Documentation License" or
can be downloaded at: http://www.gnu.org/licenses/fdl.html