Compilation "à la main".
Supposons que vous avez sauvegardé le code précédent dans un fichier nommé codice_1, pour le compiler tapez la commande suivante :
 $ gcc -Wall -g bonjour.c -o bonjour_monde -L/usr/X11R6/lib \
 -lgtk -lgdk -lglib -lXext -lX11 -lm
Les bibliothèques invoquées ci-dessus doivent toutes être dans vos chemins de recherche par défaut, sinon, ajoutez codice_2 pour que gcc recherche dans ces répertoires les bibliothèques nécessaires. Sur certains systèmes (comme Debian ou Red Hat), on doit ajouter codice_3 pour qu'il trouve les bibliothèques X11. De manière générale, il est préférable de retrouver les chemins de ces librairies grâce à l'utilitaire pkg-config. Par exemple, pour gtk+, sur un certain système :
 $ pkg-config --cflags --libs gtk+
 -I/usr/include/gtk-1.2 [...] -L/usr/X11R6/lib -lgtk -lgdk -lXext -lX11 -lm -lglib
Cela affiche les options nécessaires au compilateur pour qu'il trouve la librairie gtk+ ainsi que toutes celles dont gtk+ dépend (comme X11). Étant donné que ces chemins peuvent différer d'un système à un autre, pkg-config rend notre application plus portable. On peut alors compiler notre programme en une commande :
 gcc bonjour.c -o bonjour_monde `pkg-config --cflags --libs gtk+`
Attention pour GTK-2.0 la commande est légèrement différente :
 gcc bonjour.c -o bonjour_monde `pkg-config --cflags --libs gtk+-2.0`
L'ordre des bibliothèques est important. L'éditeur de liens doit connaître les fonctions d'une bibliothèque dont il a besoin avant de les traiter.
Si vous compilez en utilisant des bibliothèques statiques, l'ordre dans lequel vous listez les bibliothèques devient très important. L'exemple donné ci-dessus devrait fonctionner dans tous les cas.
Les bibliothèques que l'on utilise sont :
Compilation avec autoconf/automake.
Dans codice_11, il faut ajouter :
 dnl Checks for libraries.
 AM_PATH_GTK_2_0(2.2.0,AC_MSG_ERROR(mypkgname 0.1 needs GTK+ 2.2.0))
Dans codice_12, il faut ajouter :
 INCLUDES = @GTK_CFLAGS@
 LDADD = @GTK_LIBS@

Programmation GTK/Théorie des signaux et des rappels

Avant de voir en détail le programme « Bonjour tout le monde », nous parlerons d'abord des événements et des fonctions de rappel. GTK est dirigé par les événements, ce qui signifie qu'il restera inactif dans gtk_main jusqu'à ce qu'un événement survienne et que le contrôle soit passé à la fonction appropriée.
Ce passage du contrôle est réalisé en utilisant le concept de « signal ». Lorsqu'un événement survient, comme l'appui sur un bouton, le signal approprié sera « émis » par le widget qui a été pressé. C'est de cette façon que GTK réalise la plupart de son travail. Pour qu'un bouton réalise une action, on configure un gestionnaire de signal pour capturer ces signaux et appeler la fonction adéquate. Ceci est fait en utilisant une fonction comme :
 gint gtk_signal_connect (GtkObject *object,
 gchar *name,
 GtkSignalFunc func,
 gpointer func_data);
Où le premier paramètre est le widget qui émettra le signal, et le deuxième est le nom du signal que l'on souhaite intercepter. Le troisième paramètre est la fonction que l'on veut appeler quand le signal est capturé, et le quatrième sont les données que l'on souhaite passer à cette fonction.
La fonction spécifiée par le troisième paramètre s'appelle une « fonction de rappel » et doit être de la forme :
 void callback_func(GtkWidget *widget, gpointer callback_data);
Où le premier paramètre sera un pointeur vers le widget qui a émis le signal, et le second un pointeur vers les données passées par le dernier paramètre de la fonction codice_1 décrite plus haut.
Un autre appel utilisé dans l'exemple « Bonjour tout le monde » est :
 gint gtk_signal_connect_object (GtkObject *object,
 gchar *name,
 GtkSignalFunc func,
 GtkObject *slot_object);
codice_2 est la même chose que codice_1 sauf que la fonction de rappel utilise un seul paramètre : un pointeur vers un objet GTK. Lorsqu'on utilise cette fonction pour connecter des signaux, le rappel doit être de cette forme :
 void callback_func (GtkObject *object);
Où l'objet est d'ordinaire un widget. En général, on ne configure pas de rappels pour gtk_signal_connect_object. D'habitude, ceux-ci sont utilisés pour appeler une fonction GTK acceptant un simple widget ou objet comme paramètre, comme dans notre exemple.
La raison pour laquelle il y a deux fonctions pour connecter les signaux est simplement de permettre aux fonctions de rappel d'avoir un nombre différent de paramètres. De nombreuses fonctions de la bibliothèque GTK n'acceptent qu'un simple pointeur vers un GtkWidget comme paramètre et vous pouvez donc utiliser codice_2 pour celles-ci, tandis que pour vos fonctions vous pouvez avoir besoin de fournir plus de données aux fonctions de rappel.

Programmation GTK/Bonjour tout le monde pas à pas