Programme unter Linux kompilieren

Dreiklang

Viele Linux-Anwender scheuen sich, Programme zu installieren, die nur im Quelltext vorliegen. Glücklicherweise hat sich in diesem Bereich ein System durchgesetzt, das den Übersetzungsprozess extrem vereinfacht und keinerlei Programmierkenntnisse voraussetzt.

Ein neues Linux-Programm bietet endlich die Funktionen, nach denen man schon lange gesucht hat. Schnell eilt man auf die Internet-Seite des Autors, doch dort folgt prompt die Enttäuschung: Es gibt kein Programmpaket für die eigene Distribution. Stattdessen findet sich eine Datei, die auf die Endung .tar.gz oder .tgz hört.

Bei vielen Linux-Programmen stolpert man immer wieder über derartige Pakete, insbesondere bei brandneuen Versionen. Wer ein solches Archiv im Packprogramm öffnet, erhält lediglich eine noch mysteriösere Sammlung von Textdateien. Sie enthalten den so genannten Quellcode des Programms, der sich mit geeignetem Zubehör in eine ausführbare Anwendung verwandeln lässt.

Stellvertretend für alle anderen Anwendungen tritt im Folgenden das kleine Videoschnittprogramm Kino [2] an. Auch wenn es einigen Distributionen als leicht installierbares Paket beiliegt, bietet sie ein gutes Beispiel dafür, wie aus einem Quelltextarchiv ein fertiges Programm entsteht.

Abbildung 1: Kino bietet der Programmautor nur als Quelltextarchiv an.

Quelltexte

Programme bestehen aus Prozessoranweisungen in der für die jeweilige Rechnerarchitektur passenden Maschinensprache. Eine lesbare Darstellung solcher Programme ist Assembler-Code, doch meist werden Programme in einer allgemeineren Hochsprache (z. B. C, C++) geschrieben, die dann von einem Compiler in die Maschinensprache übersetzt wird.

Um eine Anwendung zu erstellen, schreibt der Autor die entsprechenden Befehle in der gewählten Sprache nieder. Die so entstehenden Programmtexte heißen Quellcode (englisch: source code), weil sie aus Sicht des Compilers die Quelle für seine Arbeit sind.

Abbildung 2: Kleiner Ausschnitt aus dem Quellcode von Kino.

Das Anbieten von Anwendungen als Sammlung von Quellcode-Dateien bietet einige Vorteile: Zum einen sparen die Autoren erheblichen Aufwand, da sie nicht für jede der unzähligen Distributionen ein Paket schnüren müssen. Außerdem läuft Linux auf vielen verschiedenen Plattformen, wie zum Beispiel dem Apple Macintosh, der einen anderen Prozessor als PCs besitzt. Für alle Plattformen Pakete zu erstellen, bedeutet erneut hohen Aufwand – zudem hat nicht jeder Entwickler Zugang zu allen von Linux unterstützten Plattformen.

Lies mich

Auch im Beispiel des Programms Kino stellt der Autor die Anwendung ausschließlich als Quellcode bereit. Wie allgemein üblich, bietet er alle notwendigen Dateien in einem komprimierten Archiv an. Das Einpacken erledigen dabei das Archivierungsprogramm tar und das Packprogramm gzip. Von diesen beiden Werkzeugen stammt auch die Dateiendung .tar.gz oder verkürzt .tgz. Der Dateiname selbst enthält den Namen des Programms und in der Regel noch eine Versionsnummer (kino-0.6.4.tar.gz).

Dieses Archiv lässt sich mit jedem gängigen Packprogramm auspacken – zum Beispiel mit Ark unter KDE. Der Befehl auf der Kommandozeile lautet tar xvzf dateiname. Die Endung .tar.bz2 besitzen tar-Archive, die mit dem alternativen Packprogramm bzip2 komprimiert wurden; für solche Pakete lautet der Aufruf tar xvjf dateiname.

Abbildung 3: Die Verzeichnis- und Dateistruktur von Kino nach dem Entpacken.

Die entpackten Verzeichnisse und Dateien folgen einem bestimmten Schema. In den meisten Fällen wird – wie auch bei Kino – ein neues Verzeichnis erstellt, welches das gesamte Projekt aufnimmt. Dort finden Sie einige Textdateien, deren Inhalte Tabelle 1 zusammenfasst.

Tabelle 1: Übersicht der wichtigsten Hilfedateien

AUTHORS Informationen über die Autoren oder den Hersteller des Programms
BUGS Bekannte Fehler des Programms
ChangeLog Änderungen oder Neuerungen gegenüber der Vorversion
COPYING Die Programmlizenz
INSTALL Anleitung für die Installation
NEWS Aktuelle Informationen
README Wichtige Erstinformationen
THANKS Danksagungen
TODO Liste mit geplanten Funktionen für die nachfolgenden Versionen

Je nach Umfang und Größe des Projektes treffen Sie nur einige dieser Dateien an. Manche Programmautoren kochen ihr eigenes Süppchen und weichen von diesen Konventionen ab. Obligatorisch ist aber in jedem Fall die Lektüre aller Dateien, die README im Namen tragen.

Stehen wider Erwarten keinerlei Informationen zur Verfügung, halten Sie nach einem Unterverzeichnis help oder doc (für Documentation) Ausschau. In ihm finden sich weitere Hilfen oder Anleitungen. Als letzte Anlaufstelle bleibt noch die Homepage des Programms oder des Autors.

Zutaten

Bevor das Programm erzeugt werden kann, müssen Sie klären, welche zusätzliche Software Sie für die Übersetzung benötigen – in der Regel Bibliotheken oder weitere Programme und natürlich den Compiler selbst. Bibliotheken enthalten fertige Funktionen, die mehrere Programme gleichzeitig nutzen können. Das spart einigen Entwicklungsaufwand und reduziert bei dynamisch gelinkten Libraries später den Verbrauch des Hauptspeichers, weil die gleiche Funktionalität nicht mehrfach von verschiedenen Programmen in den Speicher geladen wird.

Die Angaben über die benötigte Software und – ganz wichtig – deren Versionsnummer finden Sie in einem der genannten Dokumente (Tabelle 1).

Abbildung 4: Bei Kino finden Sie die Angaben über die benötigten Bibliotheken auf der Homepage.

Wenn der Übersetzungsvorgang scheitert, liegt das meist an einer fehlenden oder falschen Version einer Bibliothek bzw. eines Programms. Fast immer brauchen Sie den Compiler selbst (meist den C-Compiler gcc) und das kleine Werkzeug make.

Steht die Liste der benötigten Software-Pakete fest, müssen Sie diese suchen. Der erste Anlaufpunkt ist die eigene Distribution. Dabei sollten Sie beachten, dass einige Distributoren eine Anwendung häufig in zwei Pakete aufspalten. Suse Linux teilt Software zum Beispiel in Haupt- und spezielle Entwicklungspakete; letztere erkennen Sie an den Namensanhängseln devel (Suse, Red Hat) oder dev (Debian). So brauchen Sie für Kino unter Suse nicht nur gnome-libs, sondern auch das Paket gnome-libs-devel. Werden Sie auf den Medien Ihrer Distribution nicht fündig, hilft das Internet weiter: RPM-Pakete macht http://rpmfind.net/ ausfindig [3], das Debian-Pendant ist der Befehl apt-cache search.

Die zusätzlich benötigte Software müssen Sie vor allen weiteren Schritten korrekt in Ihr System einspielen. Eventuell müssen Sie dazu weitere Anwendungen oder Bibliotheken kompilieren.

Konfiguration

Nach diesen Vorbereitungen folgt eine oft als Dreisatz bezeichnete Befehlsfolge. Sofern noch nicht geschehen, öffnen Sie zunächst ein Terminal-Fenster. Wechseln Sie in das Unterverzeichnis des entpackten Programms, beispielsweise kino-0.6.4. Dort befindet sich ein ausführbares Skript mit dem Namen configure. Bei einigen kleinen oder einfachen Programmen fehlt dieses Skript. In einem solchen Fall können Sie diesen Schritt überspringen.

configure erfüllt zwei wichtige Aufgaben: Nach dem Aufruf mit

./configure

prüft es zunächst, ob die benötigte Software in den richtigen Versionen installiert ist. Sollte dem nicht so sein, bricht das Skript mit einer entsprechenden Fehlermeldung ab, zum Beispiel wie folgt:

checking for libraw1394/raw1394.h… no
configure: error: raw1394.h not found  install libraw1394-devel

Hier fehlt die Datei libraw1394.h aus dem Paket libraw1394-devel.

Abbildung 5: In dieser Beispielausgabe bemängelt "configure" das Fehlen der Datei "raw1394.h" aus dem Paket "libraw1394-devel".

Wurden keine Probleme entdeckt, passt configure den Quellcode noch an das vorhandene Linux-System an. Genauer gesagt erzeugt es zunächst die weiter unten behandelten Makefiles und fasst Informationen über bestimmte Systemeigenschaften in der Datei config.h zusammen.

Einige Programmautoren erlauben es, dem Skript spezielle Konfigurationsoptionen mit auf den Weg zu geben. Auf diese Weise lässt sich zum Beispiel eine andere grafische Oberfläche wählen.

Eine oft benötigte Option ist --prefix. Mit der biegt man das vorgegebene Installationsverzeichnis um (meist /usr/local). So führt ein ./configure --prefix=/opt/kde3 dazu, dass das Programm unter /opt/kde3/ installiert wird. Eine Übersicht aller möglichen Optionen liefert ./configure --help. Lassen Sie sich dabei nicht von der Vielzahl der Parameter irritieren – die meisten sind bereits standardmäßig korrekt gesetzt und beziehen sich auf den Übersetzungsvorgang selbst. Wichtige Optionen, die vom Programmautor hinzugefügt wurden, beginnen meist mit --enable oder --disable. Weitere Erklärungen sollten die weiter oben angesprochenen Hilfedateien liefern.

Mach es!

Bereits der Quellcode kleinerer Programme besteht heutzutage nicht mehr nur aus einer Datei – ein Blick in das für diese Dateien vorgesehene Unterverzeichnis src zeigt das. Die Quellcode-Dateien erkennt man an den Endungen .c, .cc oder .cpp. In den Dateien mit der Endung .h (für Header; auch Include-Dateien genannt) befinden sich Beschreibungen bereitgestellter Funktionen.

Damit Sie den Compiler nicht mit jeder Datei einzeln aufrufen müssen, wurde das kleine Hilfsprogramm make erschaffen. Es startet für jede Quellcode-Datei den Compiler und übernimmt somit sämtliche Arbeiten. Gesteuert wird sein Verhalten über so genannte Makefiles.

Abbildung 6: Ausschnitt aus einem Makefile des Programms Kino.

Von diesen Makefile-Dateien gibt es in jedem (Unter-)Verzeichnis genau eine. Sie enthalten Regeln, die beschreiben, wie aus den Einzelteilen das fertige Programm komponiert wird. Nur in seltenen Fällen muss man diese Dateien selbst verändern – configure oder der Programmautor nehmen dem Anwender die Arbeit bereits ab. Dadurch reicht es aus, den Übersetzungsvorgang mit einem simplen make anzustoßen. Die Ausgaben, die nun über den Bildschirm rasen, enthalten jeweils den Aufruf des Compilers für eine Quellcode-Datei und seine Ausgaben.

Abbildung 7: Hier wurde der Übersetzungsvorgang für Kino angestoßen. Der schwarz markierte Bereich entspricht einem einzigen Aufruf des Compilers gcc.

In der Regel gibt der Compiler ab und an einige Warnungen aus, die Sie aber ignorieren können. Bei Fehlern bricht der gesamte Prozess automatisch ab. Beachten Sie dabei nur die erste auftauchende Fehlermeldung, da diese meist die anderen nach sich zieht. Der erste Schritt sollte dann ein erneuter Blick in die Dokumentation sein.

Meist moniert der Compiler eine fehlende Datei. Dies weist entweder darauf hin, dass eine benötigte Bibliothek, Anwendung oder ein Paket nicht installiert ist oder aber die Angaben über den Ort dieser Datei in den Makefiles falsch oder gar nicht vorhanden sind. Um herauszufinden, welcher Fall eingetreten ist, suchen Sie zunächst die Datei in Ihrem System. Ist die Datei unauffindbar, fahnden Sie, welches Paket sie enthält. Sofern Ihre Distribution hierfür kein Werkzeug bereit stellt (z. B. eine geeignete Funktion im Paket-Manager), helfen Suchmaschinen im Internet [3]. Ist die Datei vorhanden und installiert, bleibt nur eine manuelle Anpassung der Makefiles (siehe Kasten 1).

Meldet der Compiler keine Fehler, befindet sich das fertige Programm entweder in einem Unterverzeichnis (meist bin, manchmal src) oder direkt im obersten Verzeichnis des Projekts.

Installation

Um die erstellte Anwendung zu installieren, melden Sie sich zunächst als Administrator root an:

su root

Mit

make install

spielen Sie das Programm in Ihr System ein. install ist dabei eine im Makefile definierte Regel. Sie weist make an, die Programmdateien in die richtigen Verzeichnisse zu kopieren. Der Befehl make -n install simuliert diesen Vorgang – so können Sie beobachten, was bei einer richtigen Installation passieren würde.

Beachten Sie, dass der Paket-Manager Ihrer Distribution über diesen Prozess keinerlei Informationen erhält. Deinstallieren können Sie das Programm nur, indem Sie die Dateien von Hand löschen. Aus diesem Grund stellen einige wenige Autoren eine Deinstallationsroutine bereit: Sie rufen sie über make uninstall auf. Leider entfernen Sie mit diesem Kommando nicht immer alle Programmdateien restlos. Das im LinuxUser 05/2002 vorgestellte Werkzeug checkinstall springt in diese Lücke, indem es nach dem Übersetzen ein RPM- oder Debian-Paket erstellt, das dann mit den normalen Paketverwaltungs-Tools installiert wird [4].

Hilfe

Sofern man die beiliegenden Anweisungen der Autoren befolgt, sollte man schnell zu einem ausführbaren Ergebnis gelangen. Zusätzlich existieren einige (auch grafische) Hilfsprogramme, die den gesamten hier vorgestellten Übersetzungsvorgang übernehmen oder überwachen.

Falls immer noch Probleme auftauchen, können Sie nach FAQs (Frequently Asked Questions; häufig gestellte Fragen), Foren oder ähnlichen Materialien suchen, die auf der Homepage des Entwicklers bereit gestellt werden – vielleicht ist Ihr Problem ja bereits bekannt. (hge/pju)

Abbildung 8: Die Homepage von Kino bietet viele weitere Hilfen an, zum Beispiel eine FAQ-Liste.

Kasten 1: Makefiles

In einigen Fällen ist man gezwungen, die mitgelieferten Makefiles zu ändern. Ein Makefile besteht aus einer Reihe so genannter Regeln. Diese beschreiben, wie ein "Ziel" (z. B. das Programm) aus welchen Dateien wie erstellt werden soll. Dazu ein kleines Beispiel:

meinprog: main.o zweitedatei.o
        gcc -o meinprog main.o zweitedatei.o
main.o: main.c a.h
        gcc -c main.c a.h
zweitedatei.o: zweitedatei.c b.h
        gcc -c zweitedatei.c b.h

Das Programm meinprog wird aus den Dateien main.o und zweitedatei.o zusammengesetzt. main.o wiederum entsteht aus main.c und a.h. Die mit gcc beginnenden Zeilen geben den nötigen Aufruf des Compilers gcc an.

Um den Compiler-Aufruf etwas flexibler zu gestalten, macht man in der Praxis regen Gebrauch von Umgebungsvariablen. Diese stehen meist am Anfang des Makefiles und sorgen dafür, dass die Regeln ein etwas kryptisches Format erhalten. Eine Änderung einer dieser Variablen hat Einfluss auf jeden Aufruf des Compilers. Hier einige wichtige Variablen im Überblick:

CC

Name des verwendeten Compilers, Bsp: CC=gccINCLUDE

Die Verzeichnisse, in denen der Compiler nach Header-Dateien suchen soll CFLAGS oder CPPFLAGS (auch mit Unterstrichen, wie C_FLAGS)

Optionen, die dem Compiler beim Starten mitgegeben werden LIB

Wie INCLUDE, nur für die BibliothekenLIBS

Weist den Compiler an, die angegebenen Bibliotheken in das Programm zu integrieren INSTDIR

In dieses Verzeichnis wird das Programm installiert

Insbesondere wenn Dateien nicht gefunden werden, kann es helfen, INCLUDE bzw. LIB um die entsprechenden Pfade zu ergänzen. Beachten Sie, dass Sie eventuell auch die Makefiles in den Unterverzeichnissen anpassen müssen. Einige der oben aufgeführten Variablen können bereits durch configure geändert werden. Informationen hierzu liefert die Hilfe:

./configure --help

Infos

[1] Detaillierte Informationen zu make und verschiedenen GNU-Compilern wie gcc: http://www.gnu.org

[2] Kino: http://kino.schirmacher.de

[3] Suchmaschine für RPM-Pakete: http://www.rpmfind.net

[4] Checkinstall-Workshop: Christian Perle, "Installieren mit Rückwärtsgang", LinuxUser 05/2002, http://www.linux-user.de/ausgabe/2002/05/062-ootb/checkinstall-3.html

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Programme selber kompilieren
    Der bekannte Dreischritt, um Programme aus dem Quelltext zu kompilieren und zu installieren, lautet "./configure", "make", "make install". Doch was verbirgt sich hinter diesen Kommandos?
  • Installationsprobleme
    Die Installation aktueller Linux-Programme läuft häufig über den "klassischen" Weg, der aus den drei Schritten ./configure, make und make install besteht. Dabei kann allerdings einiges schiefgehen, wenn etwa für das Übersetzen notwendige Pakete fehlen. Schauen wir uns die typischen Probleme an…
  • So beheben Sie Fehler bei der Ausführung von make
    Wenn das configure-Skript fehlerfrei durchgelaufen ist, stehen nur noch make und make install zwischen dem Anwender und der neuen Software. Auch hier steckt der Teufel bisweilen im Detail.
  • Software-Installation leicht gemacht
    Linux-Programme kommen nur selten mit einer Setup-Datei daher, die vollautomatisch die Installation durchführt – während fast alle Windows-Produkte mit einem Install-Tool ausgeliefert werden, das die Platten auf freien Platz untersucht, ein geeignetes Verzeichnis unterhalb von c:\Programme vorschlägt und schließlich noch einen Menüeintrag samt Uninstall-Prozedur anlegt, muss unter Linux meistens Hand angelegt werden. Wir zeigen, wie.
  • Einführung in die Programmiersprache C
    Die meisten Anwendungen, die für Linux verfügbar sind, haben die Entwickler in C oder C++ programmiert. Das spielt für die Installation eines fertigen Pakets keine Rolle, doch in seltenen Fällen müssen Sie in den Quelltext schauen.
Kommentare

Infos zur Publikation

LU 10/2016: Kryptographie

Digitale Ausgabe: Preis € 0,00
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Aktuelle Fragen

zweites Bildschirm auf gleichem PC einrichten
H A, 30.09.2016 19:16, 2 Antworten
Hallo, ich habe Probleme mein zweites Bildschirm einzurichten.(Auf Debian Jessie mit Gnome) Ich...
Probleme mit MPC/MPD
Matthias Göhlen, 27.09.2016 13:39, 2 Antworten
Habe gerade mein erstes Raspi Projekt angefangen, typisches Einsteigerding: Vom Raspi 3B zum Radi...
Soundkarte wird erkannt, aber kein Ton
H A, 25.09.2016 01:37, 6 Antworten
Hallo, Ich weiß, dass es zu diesem Thema sehr oft Fragen gestellt wurden. Aber da ich ein Linu...
Scannen nur schwarz-weiß möglich
Werner Hahn, 20.09.2016 13:21, 2 Antworten
Canon Pixma MG5450S, Dell Latitude E6510, Betriebssyteme Ubuntu 16.04 und Windows 7. Der Canon-D...
Meteorit NB-7 startet nicht
Thomas Helbig, 13.09.2016 02:03, 4 Antworten
Verehrte Community Ich habe vor Kurzem einen Netbook-Oldie geschenkt bekommen. Beim Start ersch...