21.2Programme selbst kompilieren

Es gibt zumeist nur zwei Gründe dafür, Linux-Programme selbst zu kompilieren: Entweder finden Sie für das gewünschte Programm und Ihre Distribution kein Binärpaket mit dem fertig kompilierten Programm, oder Sie möchten das Programm mit einer vom Standard abweichenden Konfiguration kompilieren.

Bevor Sie zur Tat schreiten, müssen einige Voraussetzungen erfüllt sein:

Bei Debian und Ubuntu definiert das Metapaket build-essential Abhängigkeiten für die wichtigsten Entwicklerpakete. Deswegen führt die Installation von build-essential automatisch zur Installation diverser weiterer Pakete, die zusammen die Grundausstattung für die Programmentwicklung in C/C++ bilden. Unter Ubuntu sind die durch build-essential definierten Pakete standardmäßig installiert; unter Debian führen Sie apt-get install build-essential aus.

Um die Grundvoraussetzungen für die Programmentwicklung in Fedora zu erfüllen, führen Sie am einfachsten yum groupinstall development-tools aus. Auch für die KDE- und Gnome-Programmentwicklung gibt es eigene Paketgruppen: kde-software-development und gnome-software-development.

Unter RHEL und CentOS gibt es wie in Fedora eine Paketgruppe mit Entwicklungswerkzeugen. Ihr Name lautet allerdings einfach development.

Angehende SUSE-Entwickler installieren in YaST alle Pakete des Paketschemas Grundlegende Entwicklungsumgebung. Falls Sie vorhaben, KDE- oder Gnome-Programme zu entwickeln, installieren Sie auch die Selektionen KDE- bzw. Gnome-Entwicklung. Wenn Sie zypper vorziehen, führen Sie zypper install -t pattern devel_basis bzw. devel_kde bzw. devel_gnome aus.

Code auspacken

Im Internet finden Sie den Quellcode zumeist in komprimierten TAR-Archiven. Nach dem Download entpacken Sie den Code in ein lokales Verzeichnis:

user$ tar xzf name.tar.gz (für .gz oder .tgz) user$ tar xjf name.tar.bz2 (für .bz2) user$ tar xJf name.tar.xz (für .xz) user$ cd name

Eine Alternative zu den TAR-Archiven sind Quellcodepakete, die exakt den Code enthalten, aus dem ein bestimmtes Programm Ihrer Distribution kompiliert wurde. Die Quellcodepakete finden Sie in der Regel auf dem (FTP-)Server Ihrer Distribution. Bei Distributionen auf Basis von RPM-Paketen befinden sich die Quellcodedateien in SRPM-Paketen mit der Dateikennung *.src.rpm. Zur Installation führen Sie wie üblich rpm -i aus:

root# rpm -i name.src.rpm

Es hängt von der Distribution ab, wo der Quellcode nun tatsächlich landet:

Fedora, Red Hat:

/usr/src/redhat/

SUSE:

/usr/src/packages/

Bei Debian-basierten Distributionen befindet sich der Quellcode in mehreren Dateien, die Sie am besten mit apt-get source in das aktuelle Verzeichnis installieren:

user$ apg-get source paketname

Im aktuellen Verzeichnis finden Sie nun drei neue Dateien und ein Verzeichnis:

Programm kompilieren

Zum Kompilieren und Installieren von Programmen sind drei Kommandos erforderlich, die manchmal auch als »Dreischritt« bezeichnet werden: ./configure, make und make install. Die drei Kommandos werden im Folgenden näher beschrieben. Dabei setze ich voraus, dass Sie sich im Quellcodeverzeichnis befinden.

configure ist ein Script, das testet, ob alle erforderlichen Programme und Bibliotheken verfügbar sind. Da sich das Script im lokalen Verzeichnis befindet, muss es in der Form ./configure ausgeführt werden. Das Script adaptiert die Datei Makefile, die alle Kommandos enthält, um die diversen Codedateien zu kompilieren und zu linken. Bei manchen (zumeist eher kleineren Programmen) kann es sein, dass es das Script configure nicht gibt. In diesem Fall führen Sie sofort make aus.

user$ ./configure

make löst die Verarbeitung der Compile- und Link-Kommandos aus. Sie sehen nun (manchmal schier endlose) Nachrichten und Warnungen der verschiedenen Compiler-Läufe über das Konsolenfenster huschen. Solange kein Fehler auftritt, können Sie diese Meldungen getrost ignorieren. Als Ergebnis sollte sich im Quellcodeverzeichnis nun die ausführbare Datei name befinden.

user$ make

In vielen Fällen können Sie das Programm nun sofort starten (Kommando ./name) und testen. Beachten Sie aber, dass insbesondere Netzwerk-Dienste eine spezielle Konfiguration erfordern und zumeist nur durch Init-Scripts korrekt gestartet werden!

Der letzte Schritt besteht darin, das Programm allen Benutzern zugänglich zu machen. Dazu müssen die Programm- und eventuell auch Bibliotheksdateien in öffentlich zugängliche Verzeichnisse kopiert werden. Das erfordert root-Rechte. Vor der Ausführung von make install sollten Sie sicherstellen, dass das betreffende Programm nicht schon installiert ist. Wenn das der Fall ist, sollte es vorher deinstalliert werden.

root# make install

Mögliche Probleme

Während des Kompilierens können vielfältige Probleme auftreten. Am wahrscheinlichsten ist, dass irgendwelche Compiler-Hilfswerkzeuge oder zum Kompilieren notwendige Entwicklerversionen von Bibliotheken fehlen. Diese Probleme werden in der Regel bereits durch configure festgestellt und lassen sich meist relativ leicht beheben, indem das fehlende Paket einfach installiert wird.

Schon schwieriger wird es, wenn configure nach Bibliotheken verlangt, die in Ihrer Distribution nicht oder nicht in der erforderlichen Version verfügbar sind: Dann müssen Sie sich im Internet auf die Suche nach der betreffenden Bibliothek machen und eventuell zuerst die Bibliothek kompilieren.

Zu komplexen Programmen, wie Apache oder mplayer, finden Sie im Internet richtiggehende Kompilieranleitungen, in denen Schritt für Schritt beschrieben wird, was in welcher Reihenfolge installiert und kompiliert werden muss.

Noch problematischer ist es, wenn während der Kompilierung ein Syntaxfehler auftritt, die Kompilation also mit einer Fehlermeldung abbricht. Schuld daran ist oft nicht ein Programmfehler, sondern eine Inkompatibilität zwischen Ihrem Compiler und dem Code. Manche Programme können nur mit einer bestimmten Version von gcc kompiliert werden, wobei es oft gerade nicht die neueste Version sein muss. Die Lösung besteht hier darin, die gewünschte Compiler-Version zu installieren. Auch hierzu finden Sie im Internet oder in den README-Dateien zum Quellcode oft genaue Anweisungen.

Selbst kompilierte Programme oder Bibliotheken können die Paketverwaltung durcheinanderbringen. Das Problem besteht darin, dass das selbst kompilierte Programm abc zwar nun auf Ihrem System installiert ist, die RPM- oder DEB-Datenbank aber nichts davon weiß. Wenn Sie nun versuchen, das Paket xyz zu installieren, das von abc abhängt, kommt es zu einer Fehlermeldung wegen scheinbar nicht erfüllter Paketabhängigkeiten. Mit rpm können Sie das Paket dank der Optionen --nodeps und --force dennoch installieren.

Die eleganteste Lösung besteht darin, das Programm nicht mit make install zu installieren, sondern zuerst in ein Paket zu verpacken und dieses dann zu installieren. Das setzt voraus, dass Sie sich zuerst mit den Kommandos zum Erstellen von Paketen vertraut machen. Außerdem ist diese Vorgehensweise ziemlich umständlich, insbesondere wenn ein Programm mehrfach getestet und neu kompiliert werden muss.

Beispiele

Der Platz in diesem Buch reicht nicht aus, um auch eine Einführung in die Programmierung in C und C++ zu geben. Da ich aber in der Vergangenheit immer wieder diesbezügliche Fragen erhalten habe, finden Sie hier eine kurze Anleitung, wie Sie das klassische »Hello World«-Programm in C und C++ programmieren und kompilieren. Für die C-Version schreiben Sie mit einem Editor die folgenden Zeilen in die Datei hello.c:

// hello.c #include <stdio.h> int main(void) { printf("Hello World!\n"); }

Mit den folgenden Kommandos kompilieren Sie das Programm und führen es aus:

user$ gcc -o hello hello.c user$ ./hello Hello World!

Der vergleichbare Code in C++ sieht so aus:

// hello.cpp #include <iostream> int main() { std::cout << "Hello World!\n"; return 0; }

Zum Kompilieren verwenden Sie nun g++ statt gcc:

user$ g++ -o hello hello.cpp user$ ./hello Hello World!

Anjuta, KDevelop, Eclipse, Emacs oder Vi?

Wenn Sie unter Linux eine komfortable Entwicklungsumgebung zur Programmierung in C oder C++ suchen, sollten Sie KDevelop (KDE) oder Anjuta (Gnome) ausprobieren. Eine mögliche Alternative ist die Entwicklungsumgebung Eclipse, die zwar speziell für Java optimiert ist, aber auch für andere Programmiersprachen verwendet werden kann. Echte Unix/Linux-Freaks betrachten auch die Editoren Vi und Emacs als Entwicklungsumgebung.