Kompilieren
Unter Kompilieren (auch: Compilierung, Kompilierung, Übersetzung, Wandlung) versteht man in der EDV die Anwendung eines Compilers auf den Quelltext eines Rechnerprogramms.
Beim Kompilieren eines Rechnerprogramms wird meist aus dem Quelltext eine Bibliothek oder ein ausführbares Programm erzeugt, die je nach Plattform beispielsweise als ausführbare Datei (Executable), Binärdatei oder Lademodul bezeichnet werden. Es kann aber auch je nach Compiler beispielsweise eine Ausgabe in einer anderen Programmiersprache erzeugt werden, die dann weiterverarbeitet wird.
Wenn durch das Kompilieren eine Bibliothek oder ein Programm erzeugt werden soll, so folgt nach dem Kompilieren ein weiterer Arbeitsschritt, der häufig automatisch mit ausgeführt wird, das Linken (Binden). Dabei werden Verweise auf die Laufzeitbibliothek (runtime library) und externe Bibliotheken aufgelöst und das vom Betriebssystem erwartete Format für Programme bzw. Bibliotheken erzeugt. Heutzutage werden dabei die externen Bibliotheken meist nicht fest zum Programm gebunden, sondern lediglich Verweise auf von mehreren Programmen gemeinsam genutzte Bibliotheken (shared libraries) erzeugt. Manche Systeme führen das Linken auch erst zur Laufzeit durch.
Komplexe Kompiliervorgänge werden im Allgemeinen durch einen Projekterstellungsprozess gesteuert.
Damit kompiliert werden kann, werden ein Compiler, ein Linker und die Maketools benötigt.
Werkzeug | Beschreibung |
---|---|
GNU C-Compiler gcc | Zum Kompilieren von in C geschriebenen Programmen. |
GNU C++-Compiler g++ | Zum Kompilieren von in C++ geschriebenen Programmen. |
Paket "glibc-devel" | Enthält die Header-Dateien zum Kompilieren und Linken von C-Programmen. |
Paket "libstdc++-devel" | Enthält die Header-Dateien zum Entwickeln von C++-Programmen enthält. Diese werden benötigt, um die Funktionalitäten von Bibliotheken dynamisch zu nutzen. |
Paket "binutils" | Enthält Werkzeuge zum Linken und Assemblieren von Objektdateien, z. B. befreit das Binary-Utility "strip" die übersetzten Dateien von überflüssigem Ballast wie Debug-Informationen und macht sie dadurch schlanker. |
Pakete "gettext" und "gettext-devel" | Werden benötigt, um Programme mit Native Language Support / NLS zu kompilieren, d. h. das installierte Programm kann später Meldungen in verschiedenen Sprachen ausgeben. |
Werkzeug make | Übersetzt den Quelltext. |
Programm patch | Kann aus einer Datei heraus Änderungen oder Versionssprünge einspielen, ohne den gesamten Quellcode einer neuen Version herunterzuladen. |
Vorgehen
1. Entpacken der vorliegenden Quelltexte, z. B. mit tar
2. Wechseln ins neue Verzeichnis
3. Lesen folgender Textdateien: "README", "NEWS", "ChangeLog" und "INSTALL", soweit diese vorhanden sind. In ihnen finden sich u. a. Hinweise, welche Programme oder Programmbibliotheken die Anwendung zu ihrer Installation benötigt und welche Optionen das Shellskript configure unterstützt.
4. Es empfiehlt sich, zuerst die distributionseigenen Ressourcen zu verwenden. Nur wenn eine Bibliothek nicht vorhanden ist, sollte auf fremde Quellen zurückgegriffen werden.
5. Bei Bedarf kann die Datei "Makefile" bearbeitet werden. Normalerweise wird stattdessen aber das Shellskript configure aufgerufen, das prüft, ob Abhängigkeiten und andere Voraussetzungen erfüllt sind. Dabei können auch abweichende Pfade angegeben werden, die es beim Erzeugen der Datei "Makefile" berücksichtigt. Fehlen für den Kompiliervorgang oder den späteren Betrieb notwendige Dateien, so bricht das Skript ab. Im Erfolgsfall wird die Datei "Makefile" erzeugt.
6. Nach dem ersten Lauf von "configure" wird angezeigt, ob alle notwendigen Werkzeuge und Bibliotheken auf dem System vorhanden sind. Falls etwas fehlt, würde "make" im folgenden Schritt abbrechen.
7. Aufruf von make zum Übersetzen des Quelltexts mit Hilfe des zuvor erstellten "Makefile".
8. Der Befehl "make install" muss als Benutzer "root" aufgerufen werden, da der Verzeichnispfad unter "/usr/local" ihm gehört.
Achtung: Sowohl der Inhalt des configure-Skripts als auch des Makefile können das System vollständig ruinieren, wenn "make" anschliessend mit den Befugnissen von Benutzer "root" arbeitet und Angaben fehlerhaft sind. Es muss deshalb unbedingt vermieden werden, den Einzeiler "./configure && make && make install" als Benutzer "root" aufzurufen. Die Befehle "configure" und "make" müssen durch den unprivilegierten Benutzer ausgeführt werden - erst dann kommt Benutzer "root" mit "make install" zum Zuge.
Aus dem oben gesagten ergibt sich die übliche Reihenfolge des Kompilierens (oft als "Dreisatz" bezeichnet).
$ ./configure $ make # make install
Ebenfalls möglich wäre "./configure && make && make install" - in diesem Fall müssen aber die Verkettung der drei Befehle als Benutzer "root" ausgeführt werden, was aus Sicherheitsgründen nicht zu empfehlen ist.