Hallo und herzlich willkommen zur zweiten Tafelübung in der Systemprogrammierung.
Heute steht auf dem Plan euch auf die erste richtige Programmiaufgabe der LILU vorzubereiten.
Der erste Punkt, der hierbei auf dem Plan steht, ist euch überhaupt zu zeigen, wie man ein Programm richtig übersetzen und ausführen kann.
Auch wenn ihr das in der ersten Beispielaufgabe der Code zwar schon gemacht habt,
wollen wir euch jetzt im Detail erklären, was die Kommandozeile, die ihr verwendet habt, bewirkt hat.
Beim letzten Mal habt ihr eine Kommandozeile gehabt, die ungefähr so aussieht, wie die hier dargestellte.
Das heißt, ihr habt den GCC-Compiler aufgerufen mit den Argumenten KleinO,
den Namen der Ausgabedatei und schließlich einer Eingabedatei.
Was der GCC-Compiler dann damit gemacht hat, ist, er hat die Datei, in diesem Fall Test C, eingelesen,
in ein ausführbares Programm übersetzt und die Ausgabe in die Datei Test übersetzt.
Zumindest in diesem Beispiel.
Wenn man das kompilierte Programm ausführen möchte, kann man das in diesem Beispiel ganz einfach mit Test machen.
Dabei ist aber zu beachten, dass man hier den relativen Pfad der Datei angeben muss.
Das heißt, dass man hier Punkt Schrägstrich Test schreiben muss.
Oder man kann die Datei ausführen, indem man den absoluten Pfad angebt.
Man kann mit Optionen wie eben den Bindestrich Klein O den GCC-Compiler dabei beeinflussen, wie er arbeitet.
Es gibt noch weitere Optionen, zum Beispiel Bindestrich Klein G, mit dem man den GCC anweisen kann,
Debug-Informationen mit in die Ausgabetatei zu schreiben.
Debug-Information bedeutet, dass zu jeder ausführbaren Instruktion in der Ausgabetatei ein Verweis zu der entsprechenden Zeile im Quelltext steht.
Sodass man später genau nachvollziehen kann, welche Instruktion zu welcher Zeile im Quellcode gehört.
Außerdem gibt es noch die Option Bindestrich Klein C, mit der man den GCC anweisen kann,
nicht gleich ein ausführbares Programm zu erstellen, sondern nur die Eingabetatei in Maschinenbefehle zu übersetzen.
Was anschließend noch fehlt und aus dem Maschinencode ein ausführbares Programm zu machen, ist das sogenannte Linken.
Das bedeutet der Prozess, dass den einzelnen Instruktionen eine Adresse gegeben wird.
Außerdem fehlen noch die Verweise auf gegebenenfalls zusätzlich einbindende Bibliotheken.
Mit der Option Bindestrich WALL kann man den GCC sagen, dass er möglichst viele Warnungen für potenzielle Fehler ausgeben soll.
Das bedeutet, wenn der Compiler annimmt, dass der Programmierer einen Fehler gemacht hat,
würde er eine Warnung auf dem Bildschirm ausgeben, die erklärt, worin der Fehler liegt.
Eine Warnung führt also zu einer Ausgabe am Bildschirm.
Mit der Option W Error kann man alles noch ein bisschen verschärfen.
Hier weist man den GCC dazu an, dass wenn eine Warnung gedruckt werden soll, er den Kompiliervorgang abbricht.
Das heißt, es wird keine Ausgabedatei erstellt.
Der Unterschied zwischen WALL und W Error ist also, bei WALL werden nur Warnungen ausgegeben
und wenn man zusätzlich noch das Flag W Error hinzugibt, bricht der Compiler ab, ohne eine Ausgabedatei zu erstellen.
Während man sein eigenes Programm übersetzen möchte, werden oft Fehlermeldungen vom Compiler an den Kopf geworfen,
weil man irgendetwas falsch gemacht hat.
Diese Fehlermeldungen sind zum Teil etwas schwierig zu verstehen.
Deshalb wollen wir an dieser Stelle auf die gängigsten eingehen und euch zeigen, wie man die Propelleme löst.
Ich habe hier ein kleines Beispielprogramm vorbereitet, das ich einmal kompiliere.
Und schon sehe ich einige Fehlermeldungen.
Wenn man mehrere Fehlermeldungen auf einmal sieht, lohnt es sich bei Compilerfehlermeldungen immer von oben nach unten zu lesen
und immer erst die erste Fehlermeldung zu beseitigen und dann erneut zu kompilieren.
In dem Fall ist die erste Fehlermeldung einmal implicit declaration of function printf.
Dabei sehe ich, dass der Fehler in der Datei test.c in Zeile 5 aufgetreten ist.
Also öffne ich mal die Datei test.c in Zeile 5.
Und hier sehe ich den Aufruf an die Funktion printf mit einem Argument.
Der Fehler implicit declaration bedeutet, dass der Compiler auf eine Funktion gestoßen ist, von der er die Signatur noch nicht kennt.
Da es sich bei printf um eine Bibliotheksfunktion handelt, müssen wir die Signatur der printf Funktion aus einer header-Datei inkludieren.
Wenn wir wissen wollen, in welcher header-Datei printf definiert ist, müssen wir die Man-Page zu printf öffnen.
Auf der Man-Page steht unter dem Punkt Synapses, dass wir hier die Datei stdio.h inkludieren müssen.
Zugänglich über
Offener Zugang
Dauer
00:08:00 Min
Aufnahmedatum
2021-04-22
Hochgeladen am
2021-04-22 15:07:17
Sprache
de-DE