Antwort von
nach einer Stunde
hilfreich
Re: Wie linkt man was ist das?
Hi,
Was hat das Linken auf sich.
Ein compiler uebersetzt den Code in einem File in Assembler und kann ihn dann entweder als "exe" (ausfuehrbares binaeres Programm) oder "Objekt-File" (ebenfalls binaer aber nicht ausfuerbar) speichern. Bei der Uebersetzung werden alle Datein, die ueber "#include ..." eingebunden wurden einfach in den code an stelle des "#include ..." eingefuegt und mit uebersetzt (daher duerfen manche Dinge, wie Funktions-Definitionen - im egensatz zu Funktionsdeklarationen - nicht in Header-Files stehen, falls der Header in verschiedenen Programmteilen eingefuegt wird). Ist ein Programm in mehrere Files gegliedert (was eigentlich immer der Fall ist, da man kaum ohne Bibliotheken - mindestens Standard lib, bei C++ die STL - auskommt), werden die einzelnen Files vom Compiler in Assembler uebersetzt und als Objekt-Flies (hat nichts mit objekt orientierter Programmierung zu tun!!!) gepeichert und dann vom Linker gelinkt und das Erbegnis als exe gespeichert. Wenn Du zum Beispiel in Deinem Programm eine Bibliotheksfunktion verwendest (z.B. printf oder cout, wobei bei letzerem die Funktion im ueberladenen << Operator versteckt ist), kann der Compiler nicht wissen, was da genau passieren soll. Da der Header mit der entsprechenden Deklaration eingefuegt wurde geht er aber davon aus, dass das seine richtigkeit hat und fuegt an der entsprechenden Adresse einen Verweis ein. Der Linker setzt dann an die Stelle des Verweises die Adresse der Funktion, die er ja kennt, da er alle Files, die zum Programm gehoeren zusammenfuegt. Eine Funktion ist auch nichts anderes als ein Speicherbereich, der in besonderer Weise Organisiert ist, und hat hat auch eine Andresse. Ausser den Funktionen muessen auch noch statische Membervariabeln und andere globale Variabeln gelinkt werden.
Der Linker setzt also Coe zusammen, der auf mehrere (Objekt-) Dateien verteilt ist. Wenn Du mal eine Funktion in einem Header Deklarierst, aber niergendwo definierst, bekommst Du einen Linker-Fehler. Das sollt bei Deinem Compiler (als Compiler bezeichnet man dummerweise oft auch die Kombination aus Compiler und Linker) eine spezielle Fehlermeldung ausloesen.
gruss
Thorsten