Programmieren in C mit GTK+
Aus Fedorawiki.de
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.
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:
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
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+.