Willemers Informatik-Ecke
C und UNIX sind eng verwoben
Lange Zeit wurde jeder UNIX Maschine immer auch ein C-Compiler beigelegt.
Selbst wenn dieser in den späteren Jahren
als Handwerkszeug für den Softwareentwickler aufgrund mangelnder Aktualität
wenig brauchbar war, benötigte ihn der Administrator, um einen neuen Kernel
zu erstellen. Inzwischen ist es längst üblich, dass man den C-Compiler dazu
kaufen muss.
Der GNU-Compiler
Dies, die Qualität manches Compilers und die Inkompatibilität zwischen den
Compilern führte dazu, dass inzwischen der
GNU-Compiler ein wichtiger Standard auf den UNIX-Maschinen ist. Er ist für
fast jede Plattform erhältlich, er verhält sich überall gleich und ist immer
auf dem neuesten Stand. Dazu kommt, dass er kostenlos verfügbar ist.
Das klingt fast nach einem Perpetuum Mobile der Informatik.
Der Hintergrund sind die Universitäten, die mit diesem Compiler ein Grundgerüst
zur Verfügung haben, um Studenten die Prinzipien des Compilerbaus zu lehren.
Ergebnisse der Compilerbauforschung gelangen über Diplomarbeiten sehr schnell
in die Weiterentwicklung.
Aufruf durch cc
Der UNIX C Compiler wird immer als cc aufgerufen. Dabei erkennt er
selbst, ob er als Präcompiler, als Compiler oder als Linker tätig werden
soll. Selbst ob es sich um C oder C++ handelt erkennt er an der Extension
der Dateien. Obwohl hinter dem cc sehr unterschiedliche Compiler
verschiedenster Hersteller stecken können, sind die wichtigsten Optionen
überall gleich.
Wer vom PC oder Mac kommt, wundert sich vielleicht, dass sich unter UNIX
keine IDE (Integrated Development Environment) durchgesetzt hat. Tatsächlich
gibt es diese Umgebungen natürlich auch für X, wie beispielsweise das Apex
unter Solaris. Dennoch arbeiten die meisten UNIX Programmierer von der Shell
aus. Durch das sehr leistungsfähige make (siehe später) braucht das
Übersetzen nur ein Kommando und man kann Abhängigkeiten definieren, die mit
IDEs kaum machbar sind.
Für einen ersten Versuch soll ein einfaches Programm übersetzt und gestartet
werden. Es heißt moin.c und grüßt die Region (Die weltmännischeren
Programmierer können auch gern die Welt grüßen.)
gaston> cat moin.c
main()
{
puts("Moin, Torfmoorholm!");
}
gaston> cc moin.c
gaston> a.out
Moin, Torfmoorholm!
gaston>
|
Aufruf und Parameter
Der C-Compiler wird mit cc gefolgt von dem Dateinamen der Quelldatei
aufgerufen. Es entsteht die ausführbare Datei a.out.
Mit Hilfe der Flag -o kann der Name der Zieldatei geändert werden.
cc ruft nacheinander Precompiler, C-Compiler, Assembler und Linker
auf.
Wichtige Optionen beim Aufruf des C-Compilers lauten:
- -o Dateiname
-
Die Ausgabedatei erhält den Namen Dateiname.
- -c Dateiname
-
Kompiliert eine einzelne C-Quelltextdatei.
Es entsteht eine linkfähige Objektdatei mit der Endung .o.
- -IPfad
-
Ergänzt den Pfad, in dem nach Headerdateien gesucht werden soll.
- -LPfad
-
Ergänzt den Pfad, in dem nach Bibliotheken gesucht werden soll.
- -lName
-
Verwendet beim Linklauf die Bibliothek libName.a.
Die Datei wird in den Standardlinkpfaden (beispielsweise /usr/lib) und
denen durch -L angegebenen gesucht.
- -g
-
Dem Code werden Informationen für den Debugger hinzugefügt. So kann man
im Test Variablen und Funktionen mit Namen benennen.
- -DName
-
Mit dieser Option könnnen Namen definiert werden. Diese sind mit denen der
Präprozessoranweisung #define gleichwertig. Soll der name
einen Wert zugewiesen bekommen, muss -DName=Wert angegeben
werden.
Weil es so leicht zu verwechseln ist, sei es hier noch einmal auseinander
gehalten. Die Option -I ist ein großes i (für include) und gibt den Headerpfad
an und die Option -l ist ein kleines L (für library) und gibt die
hinzuzubindende Bibliothek an.
Ein paar kleine Fallstricke gibt es, auf die Programmierer, die von anderen
Umgebungen her kommen, unter UNIX leicht hereinfallen können.