Verwendung externer Librarys

Dies wird das Abschlusskapitel des C-Kurses, denn alles wichtige habe ich vorgestellt, um selbst die ersten Schritte in die eigene Programmentwicklung zu machen. Wir haben gelernt, Funktionen zu schreiben und sinnvoll anzuordnen. Nun ist es an der Zeit, sich aus der vielfältigen Auswahl von Bibliotheken (Librarys) zu bedienen und deswegen werden wir uns nun eine externe Bibliotheken ansehen, diese einbinden und die Funktionen darin nutzen.

Beispiele für derartige Bibliotheken sind

Es gibt Bibliotheken für eine Vielzahl von Problemen.

Die Library finden

Die passende Bibliothek findet sich in der Regel durch eine Recherche mit einer Suchmaschine, bzw. durch Nachfragen in einem passendem Forem, wie das unsrige oder ein auf C und C++ spezialisiertes wie unter http://www.c-plusplus.de/forum/.

Wir schauen uns als Beispiel die graphische Oberfläche GTK+ an, hier werden wir eine einfache Messagebox zeichnen lassen.

Wie funktionieren externe Librarys?

Statische Bibliotheken

Externe Librarys sind prinzipiell auch nur Objektfiles, wie unsere eigenen kompilierten Quelltexte auch. Linkt man die Objektfiles zu den eigenen Programmen hinzu, so kann man auf diese Funktionen zugreifen. Fertig.

Dynamisch gelinkte Bibliotheken

Nun kann nicht jedes Programm ein komplettes Betriebssystem hinzulinken, um Fenster darzustellen, Dateien zu öffnen und so weiter. Damit die Programme nicht zu groß werden, werden diese Funktionen von allen Programmen verwendet: Alle Programme benutzen das Betriebssystem, es muss nicht pro Programm neu geladen werden. Das Betriebssystem ist aus Sicht des Entwicklers nur ein großer Haufen von externen Librarys. Unter Linux nennt man sie daher „Shared Libraries“, also Bibliotheken, die man sich mit anderen teilt. Unter Windows geht man die Sache eher technisch an und nennt sie „Dynamic Linked Library“, kurz DLL. Das Konzept ist aber das gleiche: Man packt die Funktionen in die 'Shared Lib'/DLL. Zu jeder dynamisch gelinkten Bibliothek gehört eine statische Bibliothek, die nichts anderes macht, als die versprochenen Funktionsnamen (nicht deren Funktion) für unser Programm zur Verfügung zu stellen. Beim Start unseres Programm wird das Betriebssystem aufgefordert, die dynamische Bibliothek zur Verfügung zu stellen. Hier für wird die dynamische Library entweder geladen oder sie ist bereits im Speicher und wir teilen sie uns mit dem Programm, das sie zuvor geladen hat. Wir selbst rufen mit unserem Programm nun die Funktionen, die sich in der statischen Library befinden. Diese Funktionen selbst haben nur die Aufgabe, die Funktionen zu rufen, die sich in der dynamischen Bibliothek befinden. Davon bekommen wir selbst eigentlich gar nichts mit. Entsprechend macht es für uns eigentlich kaum einen Unterschied, ob wir statische oder dynamische Bibliotheken verwenden. Im Falle der dynamischen Bibliotheken müssen wir lediglich dafür sorgen, dass diese zusätzlichen Dateien auch gefunden werden. Wir müssen also sicherstellen, dass sie mit dem Betriebssystem ausgeliefert werden oder sie (z.B. bei der Installation) in passende Verzeichnisse kopieren.

Eine Library installieren

Surfen wir mal auf gtk.org vorbei und klicken oben auf 'Download'. GTK+ ist für Linux, Mac und Windows verfügbar.

Installation

Linux

Am einfachsten haben es wie immer die Linux-Benutzer, die einfach ihre Paketverwaltung beauftragen, die Developerfiles herunter zu laden:

Zum Beispiel Debian-Derivate (z.B. Ubuntu):

aptitude install libgtk2.0-dev

Damit wären wir fertig und können beim Testen der Lib weiterlesen.

Für andere Linux-Distributionen siehe hier.

Windows

Das wird ein wenig länger als unter Linux, darum habe ich es ausgelagert. Keine Panik, es ist machbar ;-)

Testen

Anschließend rufe ich hier das Programm „gtk-demo“ auf. Wenn die alles läuft geht nun ein Fenster auf, das zeigt, was GTk so kann und macht:

'gtk-demo' ist ein wunderbare Form der Dokumentation. Mit einem Doppelklick auf einen Eintrag der linken Liste geht ein Beispiel auf, auf der rechten Seite sieht man entweder eine Information, was das Beispiel demonstriert und wenn man oben auf auf „Source“ klickt, sieht man den Quelltext, bei dem man sehen kann, wie man das zu programmieren hat.

Ausführlicher erklärt das das GTK+-Tutorial auf proggen.org.

Schließen wir das Demoprogramm, GTK+ läuft. :-)

Windows-Optik

Wenn wir nun in „C:\opt\gtk\etc\gtk-2.0“ eine Datei „gtkrc“ (nicht gtkrc.txt!) erstellen und dort eine Zeile einfügen:

gtk-theme-name = "MS-Windows"

wird die Oberfläche eher an Windows angelehnt.

Ein Programm mit Hilfe von externen Librarys bauen

Ziel dieser Lektion ist nicht mit GTK+ aufwendige grafische Oberflächen zu erstellen, sondern nur eine externe Library zu verwenden. Wir werden also nur ein ganz einfaches Programm kompilieren:

Prinzipiell geht es nun darum, dem Compiler mitzuteilen, wo er die Include-Dateien findet und dem Linker, wo er die statischen Bibliotheken findet. GTK+ liefert für die Konfiguration ein praktisches Tool mit namens pkg-config. Mit pkg-config --list-all lassen sich alle Namen bekannter Konfigurationen auflisten. Wir arbeiten hier mit „gtk+-2.0“. Die Ausgabe von pkg-config erfolgt passend für den GNU-Compiler. Für den Compiler benötigen wir die C-Flags:

und für den Linker die Libs:

Benutzer des GCC-Compilers bzw. von 'make' haben es jetzt sehr einfach, sie fügen die Ausgaben direkt an den Compileraufruf an. Benutzer einer Entwicklungsumgebung müssen jetzt erst einmal den ganzen Kram in Ihre Entwicklungsumgebung übertragen.

Schauen wir uns das ganze also für die einzelnen Fälle an:

Oder wir verwenden eine Entwicklungsumgebung:

Wie immer rate ich dazu, sich Make in jedem Fall anzusehen.

Wie immer das Projekt am Schluss gebaut wird, das Ergebnis sollte ungefähr so aus sehen:

Fazit dieser Lektion

Mit dieser Lektion solltest Du erstmals gesehen haben, was C und C++ so mächtig macht, nämlich die Verwendung von Funktionen in Form von Bibliotheken, die bereits extern vorliegen. Es gibt tausende solcher Librarys, es gibt für viele Probleme fertige spezialisierte Bibliotheken, die dem eigenen Programm nur hinzugelinkt werden müssen. Somit ist es schnell und einfach möglich, aufwendige Probleme mit Hilfe von Libraries zu lösen. Im Vergleich zu .NET oder Java muss dafür keine große virtuelle Maschine (VM) mitgeliefert oder vorausgesetzt werden, sondern es entsteht ein ebenso spezialisiertes Programm.

Das Vorgehen in dieser Lektion sollte Dir das grundsätzliche Vorgehen mit einer Bibliothek demonstriert haben und Dir eine Vorstellung vermittelt haben, wie Du nun auf vorhandene Funktionalität im Betriebssystem oder auf nachinstallierte Libraries eingehen kannst.