1.3.1. Die Unix™-Welt

Wenn dem Autor an dieser Stelle eine Bemerkung erlaubt ist: Dies ist zwar nicht die beste aller Welten, aber immerhin eine schöne Welt!

Übersetzen

Zum Übersetzen ist es notwendig, dem Compiler den Pfad zu den LEDA-Header-Dateien mitzuteilen.

Unter Unix™ liegen die Header-Dateien bei der Standardinstallation im Verzeichnis incl unterhalb des LEDA-Wurzelverzeichnisses, das wir im Folgenden mit LEDAROOT bezeichnen werden. Wir sollten daher eine Umgebungsvariable LEDAROOT auf dieses Wurzelverzeichnis zeigen lassen. Auf der Maschine des Autors ist dies beispielsweise das Verzeichnis /usr/local/LEDA/LEDA4.4. Wir setzen daher in der Shell die Variable LEDAROOT wie folgt:

$ LEDAROOT = /usr/local/LEDA/LEDA4.4
$ export LEDAROOT

Dem Compiler teilen wir mittels der Option -I mit, wo er die Header-Dateien findet:

$ g++ -c HelloLEDAWorld.C -I$LEDAROOT/incl

Dadurch sollte die entsprechende Objektdatei erzeugt worden sein:

$ ls HelloLEDAWorld.*
HelloLEDAWorld.C    HelloLEDAWorld.o

Binden

Die soeben entstandene Datei HelloLEDAWorld.o müssen wir nun mit den LEDA-Bibliotheken zusammenbinden, um ein lauffähiges Programm zu erzeugen. In der gegenwärtigen Version von LEDA gibt es 7 verschiedene Bibliotheken; die statischen Bibliotheken enden auf .a, die dynamischen auf .so :

Tabelle 1.1. Die LEDA-Bibliotheken.

Bibliothek Inhalt
libL.a (libL.so) Basisbibliothek mit den Basisdatentypen (einfache Datentypen, Containertypen und Prioritäts-Warteschlangen)
libG.a (libG.so) Bibliothek mit Code für Graphen
libG2.a (libG2.so) Bibliothek mit Code für semi-dynamische Graphen
libP.a (libP.so) Bibliothek mit Code für Geometrie in der Ebene
lib3D.a (lib3D.so) Bibliothek mit Code für Geometrie im 3-dimensionalen Anschauungsraum
libW.a (libW.so) Bibliothek mit Code für Fenster und grafische Oberflächen
libGeoWin.a (libGeoWin.so) Bibliothek mit Code für einen grafischen Editor für geometrische Objekte

Welche dieser Bibliotheken auf unserem System tatsächlich vorhanden sind, hängt von dem jeweils installierten LEDA-Paket ab. In jedem Fall aber ist die Basisbibliothek libL vorhanden (in der statischen oder dynamischen Version oder in beiden Versionen gleichzeitig). In den ersten vier Kapiteln dieses Tutoriums wird ausschließlich diese Bibliothek libL benötigt.

Um nun die Objektdatei HelloLEDAworld.o mit der Basisbibliothek zu binden (diese enthält den Code für die Klasse string) müssen wir dem Compiler mitteilen, wo er diese Bibliothek findet. Das gelingt z. B. mit Hilfe der Option -L. Auf der Maschine des Autors liegen die Bibliotheken im Verzeichnis /usr/local/LEDA/LEDA4.4, also dem LEDA-Wurzelverzeichnis. Das Binden geschieht daher durch folgenden Aufruf des Compilers in der Shell:

$ g++ -o HelloLEDAWorld HelloLEDAWorld.o -L$LEDAROOT -lL -lm

[Important] Wichtig

Die mathematische Bibliothek libm muss bei LEDA-Programmen immer und immer als letzte dazugebunden werden.

Liegen dabei sowohl die dynamischen, als auch die statischen Bibliotheken im selben Verzeichnis, so wird immer gegen die dynamischen gebunden. Um ein statisches Binden zu erzwingen, müssen die statischen Bibliotheken in ein eigenes Verzeichnis gelegt und der Pfad dorthin entsprechend angegeben werden.

Selbstverständlich können Übersetzen und Binden bei einem derart einfachen Programm auch in einem Schritt durchgeführt werden:

$ g++ -o HelloLEDAWorld HelloLEDAWorld.C -I$LEDAROOT/incl -L$LEDAROOT -lL -lm

[Note] Anmerkung

Sollen mehr als nur die Basisbibliothek hinzugebunden werden, so muss folgende Reihenfolge eingehalten werden: -lD3 -lP -lG -lL -lm. Das Manual beschreibt darüber hinaus ausführlich, was bei Verwendung der Grafik-Bibliotheken libW und libGeoWin zu tun ist.

Natürlich werden wir nicht bei Hallo Welt! stehen bleiben, sondern bald größere Programme mit mehr als einer Übersetzungseinheit schreiben. Hier bietet sich die Verwendung eines Makefiles an. Im Folgenden ist ein generisches Makefile angegeben, das als Ausgangspunkt für eigene Makefiles dienen mag.

Filename: Makefile.generic
# Set the following Makefile variables according to your needs

LEDAINCLDIR = /usr/local/LEDA/LEDA4.4/incl
LEDALIBDIR  = /usr/local/LEDA/LEDA4.4
LEDALIBS    = -lL -lm
#LEDALIBS   = -lG -lL -lm
#LEDALIBS   = -lP -lG -lL -lm
#LEDALIBS   = -lD3 -lP -lG -lL -lm

CC = g++
CXXFLAGS = -Wall

# End of customizing region

# Implicit rule: How to make an executable from a .C-file
%: %.C
        # the following lines must start with a tab, not with blanks!
        ${CC} -o $@ $< ${CXXFLAGS} \
              -I${LEDAINCLDIR} -L${LEDALIBDIR} ${LEDALIBS}

Ein Aufruf

$ make -f Makefile.generic HelloLEDAWorld

erzeugt dann unser HelloLEDAWorld auf magische Weise von selbst.

Starten

Wir sind nun endlich so weit, unser HelloLEDAWorld laufen zu lassen! Einige kleine Schritte für ein Programm, ein großer Schritt für einen angehenden LEDA-Programmierer! Doch halt, nicht ganz so schnell. Falls wir dynamisch gelinkt haben, müssen wir noch dem Lader durch Anpassen der Umgebungsvariablen LD_LIBRARY_PATH mitteilen, wo er die dynamischen Bibliotheken finden kann:

$ export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/usr/local/LEDA/LEDA4.4

So, nun steht einer algorithmisch einwandfreien Erzeugung der berühmtesten Grußmeldung der Programmierwelt nichts mehr im Wege:

$ HelloLEDAWorld
Hello LEDA world!

Und wie schon erwähnt, ist der Rest jetzt nicht mehr schwer...




Imprint-Dataprotection