Ein paar Hilfestellungen zur Arbeit unter Linux/Unix FB Physik Freie Universität Berlin Computerphysik WS 2007/2008
1 2 3
user@ host :~ > gcc -o programm quelltext. c macht gleich mehrere Dinge auf einmal Vorverarbeitung des Codes (Preprocess) Übersetzen des Codes in Maschinensprache, optimieren der Ausführungsgeschwindigkeit(Compile+Optimize) Einfügen der Referenzen auf Bibliotheken, Zusammesetzen des Maschinencodes zu einem lauffähigen Programm (Linking)
Preprocessor Verarbeitet Zeilen mit # am Anfang Einzelprogramm: cpp # include blah. h // fuegt blah. h an dieser stelle ein # include <b.h > // fuegt systemheader b. h ein # define HALLO =4 // setzt praeprozessorvariable HALLO # ifdef HALLO // gibt nur dann code an compiler weiter # endif // wenn HALLO definiert ist... int a; a= HALLO ; // fuegt anstelle von HALLO dessen wert ein...
Compiler Übersetzt und optimiert den preprocessten Code. Wichtige Optionen: u@h :~ > gcc - Wall -o programm source. c # Erweiterter Syntaxcheck, findet dinge, # die spaeter zu Fehlern f\" uhren k\" onnen u@h :~ > gcc - O2 - Wall -o programm source. c # Staerkere Optimierung u@h :~ > gcc - O0 - Wall -o programm source. c # gar keine Optimierung u@h :~ > gcc -g - O0 - Wall -o programm source. c # baut Zusatzinfos fuer fehlersuche mit ein # moeglichst mit!!! - O0!!! verwenden
Linker Einzelprogamm: ld Option -lm linkt mathe-bibliothek (nuetzlich für alle, die diese undefined reference fehlermeldungen beim Compilieren sehen) ;) u@h :~ > gcc - Wall - lm -o programm source. c # Mathe - Bibliothek in " programm " einbauen
Compiler manuell immer wieder mit denselben Aufrufen nervt Lösung: das Programm make Schreibe in Datei,,Makefile im Source-Verzeichnis: aufgabe1 : aufgabe1. c gcc - Wall - lm -o aufgabe1 aufgabe1. c Schema: " target ": " depends on" # <TAB > kommandosequenz, um aus #<TAB > dateien " depends on" # <TAB > die datei " target " zu generieren
II Benutzung: aufgabe1 bauen: u@h :~ > make aufgabe1 # generiert aufgabe1, wenn sich die " depends " # geaendert haben oder " aufgabe1 " nicht existiert Wird make ohne argument aufgerufen, arbeitet es das erste target im Makefile ab: u@h :~ > make # erzeugt " aufgabe1 "
III Ein etwas komplizierteres Beispiel: all : aufgabe1 aufgabe2 # erstes " target " wird von make abgearbeitet, wenn man # kein target an der kommandozeile uebergibt aufgabe1 : aufgabe1. c gcc - Wall - lm -o aufgabe1 aufgabe1. c aufgabe2 : aufgabe2. c gcc - Wall -o aufgabe2 aufgabe2. c clean : rm -f aufgabe1 aufgabe2
IV Benutzung: u@h :~ > make # arbeitet erstes target ( all : ) ab, erzeugt also # " aufgabe1 " und " aufgabe2 " u@h :~ > make aufgabe1 # generiert aufgabe1, wenn sich die " depends " # geaendert haben oder " aufgabe1 " nicht existiert u@h :~ > make clean # loescht die dateien " aufgabe1 " und " aufgabe2 "
Konventionen in Standard-target, also das erste im Makefile, heisst all und hat alle End-Ergebnisse als Dependencies Es sollte ein Target namens clean existieren, welches alle generierten Dateien wieder löscht
tar.tar.gz-archive so ähnlich wie WinZIP-Archive. u@h :~ > tar czf name. tar. gz aufgabe1. c aufgabe2. c Makefile. # erzeugt name. tar. gz und packt die dateien in dieses archiv u@h :~ > tar tzf name. tar.gz # listet in name. tar. gz enthaltene dateien und verzeinisse a u@h :~ > tar xzf name. tar.gz # extrahiert name. tar. gz