Source-Files Programm == Source-File nicht sinnvoll Unübersichtlich Bei jeder kleinen Änderung gesamtes File neu übersetzen Übersetzen dauert lange Keine Gruppenarbeit möglich Programm in Source-Files aufteilen Erhöht Lesbarkeit Aufteilung orientier t sich an logischer Struktur des Programms Getrenntes Übersetzen möglich: Nur geänderte Files neu übersetzen Zusammenfügen der getrennt übersetzten Teile zu ausführbarem Programm Linker 2005 AG Rechner netze 4-prog.1
Getrennte Übersetzung Getrennt Übersetz en und Linken mit g++ main.cc main.o libs g++ -c main.cc util.cc util.o prog g++ -c util.cc list.cc list.o g++ -c list.cc g++ -o prog main.o util.o list.o -lx11 2005 AG Rechner netze 4-prog.2
Getrennte Übersetzung Compiler-Flags und -Pässe libs includes objects file.cc tmp file.s file.o prog g++ -E file.cc g++ -S file.cc g++ -c file.cc g++ -c file.s g++ *.cc g++ *.s g++ *.o -libs 2005 AG Rechner netze 4-prog.3
Getrennte Übersetzung: g++ g++: Driver-Programm Präprozessor Eigentlicher Compiler + Optimizer Assembler Linker g++: Optionen E S c O v Wall g o xxx lxxx Nur Präprozessor Nur Präprozessor + Compiler Nur Präprozessor + Compiler + Assembler Optimizer einschalten Einzelne Pässe, Optionen und Argumente anzeigen Viele War nungen ausgeben Debugging mit gdb/dbx ermöglichen Linker : Ausgabefile xxx anlegen (sonst a.out) Linker : mit Librar y xxx linken 2005 AG Rechner netze 4-prog.4
Getrennte Übersetzung: ld Linker (ld) Erzeugt lauffähiges Programm (executable, a.out) Eingabe: Object-Files, Librar ies Löst exter ne Symbole auf (unresolved references).o-files Maschinencode; nicht sprachspezifisch, aber plattfor mspezifisch Nicht ausführbar, muß noch gelinkt werden Enthält noch unresolved references! Libraries Statisch (file.a) oder dynamisch, shared (file.so) Symbole Alle exter nen Symbole müssen aufgelöst werden ( sonst Fehler) Symbol darf nicht mehrfach definiert sein ( sonst Fehler) Symboltabelle in Object-File oder Executable anschauen: nm 2005 AG Rechner netze 4-prog.5
Getrennte Übersetzung Konsistente Deklarationen Source-File nicht in sich abgeschlossen Benutzt Funktionen, Klassen, etc. aus anderen Files oder Librar ies Deklaration vor jeder Benutzung erforder lich Alle Deklarationen müssen konsistent sein Deklarationen müssen konsistent mit Definition sein Jedes Objekt muß genau einmal definier t werden int foo = 12; int bar(double d) { } file1.cc extern int foo; int bar(double); void baz() { foo = bar(1.0); } file2.cc 2005 AG Rechner netze 4-prog.6
Getrennte Übersetzung: Deklarationen int a = 1; char b[10]; extern int c; file1.cc int a; (1) extern char *b; extern int c; (2) (3) file2.cc Typische Fehler (1) Mehr als eine Definition (2) Definition und Deklaration inkonsistent (3) Keine Definition Fehlererkennung Problem: Compiler sieht nur jeweils ein Source-File (1) und (3) werden vom Linker erkannt (2) nicht Absturz zur Laufzeit wahrscheinlich! 2005 AG Rechner netze 4-prog.7
Getrennte Übersetzung: Deklarationen int f(int i) {} int g() {} extern int f(double); extern char *g(); (2) (1) file1.cc file2.cc (1) Definition und Deklaration inkonsistent (Argumente) Fehler kann vom Linker erkannt werden Argument-Typen werden in Symbolnamen kodier t (Over loading!) f(int,double,char*) f FidPc Problem: unterschiedliche Compiler-Konventionen (2) Definition und Deklaration inkonsistent (Return-Typ) Fehler wird nicht erkannt Absturz möglich! 2005 AG Rechner netze 4-prog.8
Getrennte Übersetzung: Deklarationen Ausnahme: const-variablen Definition kann nicht mit exter n impor tier t werden inter nal linkage Lösung: vor jeder Benutzung definieren Ausnahme: inline, (class), typedef, (template), Muß vor jeder Benutzung definiert werden Mehrfachdefinitionen erlaubt, wenn Definitionen tokenweise identisch Definitionen stehen in unterschiedlichen Files 2005 AG Rechner netze 4-prog.9
Header-Files Problem: Konsistente Deklarationen Abhilfe: Header-Files und #include Aufteilung Schnittstelle (.h-file), Implementierung (.cc-file) struct Time { int hour, min, sec; }; Time get_time(); #include "time.h" time.h Time get_time() { } time.cc #include "time.h" int main() { Time now; now = get_time(); main.cc 2005 AG Rechner netze 4-prog.10
Header-Files Was gehör t in Header-Files? Datendeklarationen extern int v; Funktionsdeklarationen int f(double); Typedefinitionen struct coord { int x, y; }; inline-definitionen inline int max(int a, int b) {} enums enum state { on, off }; const-definitionen const state s = off; Template-Definitionen templace<class T> class C {}; Weitere #includes #include "config.h" Makros #define HDR_SIZE 24 ifdefs u.ä. #ifdef DEBUG Was nicht? Datendefinitionen int v; Funktionsdefinitionen int max(int a, int b) {} 2005 AG Rechner netze 4-prog.11
Header-Files Benutzung von Header-Files Rekompilieren nach Änderung eines Header-Files Alle.cc-Files übersetzen, die.h-file includen Wer kzeug: make.cc-file included eigenes.h-file Compiler prüft Deklarationen gegen Definitionen Include-Mechanismus eigentlich kein C++-Sprachmittel Rein textuelle Ersetzung Compiler sieht nur fer tige Übersetzungseinheiten Typische Header-File-Organisation Geschachtelte #includes selten ( Mehrfachdefinitionen möglich) Üblich: ein Header-File pro.cc-file (falls nötig) Eventuell ein gemeinsames Header-File mit globalen Definitionen 2005 AG Rechner netze 4-prog.12
Header-Files #define LIBDIR \ "/usr/local/lib" #define VERSION 3 #define HAVE_X11 config.h #include <iostream.h> #include "config.h" #include "buffer.h" #include "util.h" class Buffer { vector<char> data; }; void save_buffers(); buffer.h #include <vector.h> #include "config.h" #include "buffer.h #include "util.h" void error(char*); util.h #include <iostream.h> #include "config.h" #include "util.h" int main() { Buffer::Buffer() { } void error(char *e) { } main.cc buffer.cc util.cc