Programmieren in C mit GTK+

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche

Der Artikel ist eine Einführung in die Programmierung mit GTK+.

Inhaltsverzeichnis

Voraussetzungen

Kenntnisse von, und Fähigkeiten im Umgang mit der Programmiersprache ANSI-C, dem Betriebssystem GNU/Linux oder einem anderen POSIX Betriebssystem, dem Betriebssystemkern Linux, der Shell des Betriebssystems BASH, dem "Compiler" GCC und den Programmen make und configure, sind natürlich sehr hilfreich. Je mehr man darüber weiß, desto besser. Wenn man zudem schon einmal grafische Benutzeroberflächen entworfen oder programmiert hat, umso besser.

GTK 1.2

Die Fensterkontrollelemente sind nicht mehr zeitgemäß, wie auf den Bildern zu sehen ist.

Gtk+1.2-knöpfe.png Gtk+1.2-liste.png

Aber, um zu sehen wie sich Pakete im Laufe der Zeit verändern und Bibliotheken ein enormes Ausmaß annehmen können, schauen wir uns die das veraltete Paket gtk+-devel an.

Einrichten des Pakets

Damit die GTK+-Bibliotheken als Quelltexte zur Verfügung stehen, muss das Entwicklerpaket eingerichtet werden:

[root]# yum install gtk+-devel

Der Paketinhalt

Danach sehen wir uns an, was das Paket alles mit sich bringt:

$ rpm -ql gtk+-devel | less

Das einzig ausführbare Programm im Paket ist

/usr/bin/gtk-config

und ist weiter unten im Artikel näher beschrieben.

GDK ist Teil von GTK+ und wird im Teil GTK+2 beschrieben.

Die Quelldateien liegen nun im Verzeichnis

/usr/include/gtk-1.2/

Und im Verzeichnis

/usr/share/doc/gtk+-devel-1.2.10/

findest du jede Menge Beispiele und englische Anleitungen.

Kopieren der Beispiele

Durch die Kommandozeile:

$ cp -r /usr/share/doc/gtk+-devel-1.2.10/examples/ ~/

kopierst du alle Beispiele in dein Heimverzeichnis. Das ist Notwendigkeit um die Beispiele zu "übersetzen", denn in /usr/share/doc/gtk+-devel-1.2.10/examples/ besitzt du nicht die erforderlichen Rechte, um Make dort auszuführen. Und das ist auch gut so.

"Übersetzen" der Beispielprogramme

Übersetzung per Skript

Für den Fall, dass du alle Beispiele ausführen möchtest, habe ich ein kleines Skript geschrieben. Wenn du es in eine Textdatei kopierst, kannst du es anschließend mit

$ sh <Skriptname>

ausführen. Das Skript führt make auf alle "Makefiles" in allen Unterverzeichnissen von ~/examples/ aus.

#!/bin/bash
cd ~/examples; Datenfeld=(*)
A=0
while (( $A < ${#Datenfeld[@]} ))
do
   cd ${Datenfeld[A++]}
   make -s 2>/dev/null
   cd ..
done

Manuelle Übersetzung

Mit dem Kommando cd kannst du dich in Verzeichnissen "bewegen". Durch:

$ cd examples

gefolgt von der Eingabetaste, gelangst du in das Verzeichnis mit den Beispielen. BASH enthält das Programm complete, dass der Autovervollständigung von gewissen Dingen dient. Dateinamenvervollständigung ist eines von diesen Dingen. .

$ cd e

gefolgt von der TAB-Taste, vervollständigt die Eingabe zu examples. Sollte bereits ein anderes Verzeichnis mit dem Anfangsbuchstaben e vorhanden sein, ist der zweite Buchstabe erforderlich, dies setzt sich analog fort. Durch zweimaliges Drücken der Tab-Taste, listet complete alle Verzeichnisse auf, deren Anfangsbuchstaben den bisher eingegebenen Buchstaben gleichen.

Mit

$ ls

kannst du die Unterverzeichnisse von ~/examples auflisten.

Durch cd wird dann in das entsprechende Unterverzeichnis gewechselt.

Durch die Eingabe das Kommando

$ make

führen wir make in dem jeweiligen Verzeichnis der Beispiele aus. Die C-Quelldatei mit der Endung .c wird nun von gcc übersetzt und erzeugt eine ausführbare Datei.
Ein Verzeichnis kann make durch den Parameter -f übergeben werden:

$ make -f ~/examples/table

Weitere Informationen in englischer Sprache erhält man durch die Kommandozeilen:

$ man make

und

$ info make

Auführen eines Beispieles

Nachdem make ausgeführt wurde hat sich im entsprechenden Verzeichnis einiges getan. Nach einem

$ ls

siehst du nun mindestens eine neue Datei. Wurden die Farben der Treminalemulation nicht verändert, sind ausführbare Programme grün gezeichnet. Da sich das Verzeichnis nicht in der Variablen $PATH befindet, geben wir folgende Kommandozeile ein:

$ ./Beispielname

Einen Punkt und einen Vorschrägstrich. BASH führt auf diese Art ausführbare Programme im aktuellen Verzeichnis aus.

"Übersetzen" ohne Makefile

Willst du ein GTK+-Programm ohne "Makefile" zu einem ausführbaren Programm wandeln, sieht die Kommandozeile dafür etwa so aus:

$ gcc <Quelltextname> `gtk-config --cflags --libs` -o <Name des ausführbaren Programms>

Warum ist das so komplex? Ich habe in meinem Quelltext doch ausdrücklich gesagt welche Includes ich will. Nein, hast du nicht. Du hast in der Präprozessor-Anweisung #include nur ausgedrückt, dass du eine GTK+-Bibliothek nutzen möchtest und auch die notwendige "Header-Datei", aber GCC weiß nicht genau welche du meinst.

Häh?

Der sogenannte Präprozessor wandelt deinen Quelltext erst mal in allgemeines C ohne "Makros" und Präprozessoranweisungen. Der Präprozessor muss exakt wissen, welche Funktionen er wo findet, wenn sie als #include angegeben wurden.

#include <gtk/gtk.h>

gibt die "Header"-Datei als relativen Verzeichniszweig an. Der Präprozessor will aber einen vollständigen Verzeichniszweig.

Im fertigen Programm müssen die Anweisungen aufgelöst sein und als ausführbare Funktionen vorhanden sein. Außerdem muss im Dateiformat angegeben sein, welche ausführbaren Bibliotheken vom Programm benötigt werden, um sie im Hauptspeicher abzulegen. Im Falle von GTK+ wäre das auf meinem System /usr/lib64/libgtk.so, eine Verknüpfung zu der tatsächlichen Bibliothek.

$ file /usr/lib64/libgtk.so 
libgtk.so: symbolic link to `libgtk-1.2.so.0.9.1'

Vielleicht erkennst du welche Probleme sich dadurch ergeben? Nutzt du ein 32-Bit System, ändert sich der Verzeichniszweig zu

/usr/lib/libgtk.so

Der absolute Pfad in Fedora für die momentane Version von gtk+ ist:

/usr/include/gtk-1.2/gtk/gtk.h

Tja, das kann auf allen Fedora-Rechnern so sein, muss aber nicht. Nicht jeder nutzt Fedora und nicht jeder nutzt die gleiche Version von GTK+.

Das Angeben von absoluten Verzeichniszweigen führt unweigerlich dazu, dass dein Programm nur auf deinem System von GCC "übersetzt" werden kann und nur solange die Bibliotheken nicht aktualisert werden.

Kleiner Exkurs zu Makefiles

Ein recht primitives Makefile liegt im Verzeichnis

/usr/share/doc/gtk+-devel-1.2.10/examples/table

Der Inhalt der Datei:

CC = gcc
table: table.c 
	$(CC) `gtk-config --cflags`  table.c -o table `gtk-config --libs`
clean: 
	rm -f *.o table

CC steht stellvertretend als variabler Name des "Compilers". CC ist also eine Variable. Table und clean sind Abschnitte, durch die Markierung mit einem Doppelpunkt erkennt das Programm make sie als solche.

gtk-config

Gtk-config zeigt dir welches GTK+-Entwicklerpaket du hast:

$ gtk-config --version
1.2.10

Sehen wir uns an, wo das Programm liegt:

$ which gtk-config
/usr/bin/gtk-config

Nun vollen wir den Dateityp in Erfahrung bringen:

$ file /usr/bin/gtk-config
/usr/bin/gtk-config: POSIX shell script text executable

Ah, ein Shell-Skript.
Wenn du Shell-Skripten verstehst, kannst du dir den Inhalt durch

$ more /usr/bin/gtk-config

ansehen oder durch

$ info gtk-config

englische Informationen zum Skript einholen.

Das Kommando mit Paramter

$ gtk-config --libs
-L/usr/lib64 -lgtk -lgdk -rdynamic -lgmodule -ldl -lglib -lXi -lXext -lX11 -lm

zeigt dir, welche ausführbaren Bibliotheken vorhanden sind.

GTK+ 1.2 entfernen

Hat man sich mit GTK+ 1.2 ausgetobt, kann es mit

[root]# yum erase gtk+-devel

wieder entfernt werden. Dateien die manuell im ~-Verzeichnis angelegt wurden, werden nicht durch Yum entfernt. Die Beispiele können durch

$ rm -r ~/examples/

entfernt werden.

Weitere Informationsquellen

Wer mit den englischen beigelegten Beispielen und Anleitungen nicht zurecht kommt, kann einen Blick auf die folgenden URL riskieren:
http://pronix.linuxdelta.de/C/gtk/index.shtml oder dem "Wiki-Buch" über GTK+.