003
24.10.2005, 14:42 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zitat von ~Susi: |
Ok! An der stelle ist es deklariert. Ich kenne aber auch die Stelle an der es definiert ist, denn da kommt der fehler her
|
Hm. Also irgendwie glaube ich, has Du eine andere Vorstellung von dem, was man gemeinhin als Definition bezeichnet. Ich versuchs kurz zu machen:
C++: |
int add(int a, int b) { return a+b; }
|
Das ist eine Definition. Es ist deshalb eine Definition, weil da eine geschweifte Klammer auf und zu geht. Und da drin wird definiert, was die Die Funktion macht. Dagegen ist das hier nur eine Deklaration:
C++: |
int add(int a, int b);
|
Eine Deklaration dient dem Kompiler als Platzhalter. Indem du etwas deklarierst, sagst Du dem Compiler: Es gibt eine Funktion add, die erwartet zwei ints als Parameter und gibt ein int zurück. Da hier keine geschweiften Klammern vorkommen, weiß der Compiler also nur, daß es das Ding gibt, aber nicht, wie es definiert ist.Gemerell werden in .h Dateien nur Deklarationen verwendet, und eben eine solche hast Du vermutlich verwendet.
Wenn Du jetzt das Programm kompilierst, werden verschiedene Schritte ausgeführt, die zwei hier weesentlichen sind der Compileschritt (der Funktioniert bei Dir) und der Linkschritt (der geht bei Dir schief). Im Compileschritt werden alle .c/.cpp Dateien in .obj Dateien übersetzt. Da kommt also noch keine exe raus, sondern irgendein Zwischending. In diesem Zwischending steht z.B. daß die Funktion add aufgerufen werden soll. Wenn Die Funktion in der gleichen Datei definiert wurde, dann ist alles easy, wenn die Funktion nur deklariert wurde, dann bleibt da zunächst nur ein Platzhalter der sagt: "Hier soll add" aufgerufen werden.
Im Linkschreitt werden - vereinfacht gesprochen - die Platzhalter gefüllt. dh wenn Du add nur deklariert hast, probiert er zu dem add eine Definition zu finden. Findet er sie nicht, kommt eine Meldung wie
Code: |
LNK2019: Nicht aufgelöstes externes Symbol 'add', verwiesen in Funktion 'main'
|
Kommt Dir vermutlich bekannt vor
Okay, und wie kommt der Linker an die Funktionsdefinition? Ganz einfach: Neben der .h Datei die Du irgendwo inkludiert hast musst Du dem Linker noch eine .lib Datei geben, das ist die sog. (Import)Library. Dieses Library enthält entweder dierkt die Definition der Funktion (statische Library) oder aber einen speziellen Code der das Laden der Funktion aus einer DLL ermöglicht (dynamische Lib). Ich weiß nicht, wo man das beim VC angibt, baer es gibt da einen Dialog, wo man die Libraries angeben kann, ganz sicher. Welche Library du konkrete angeben mußt, weiß ich auch nicht, weil ich das Programm nicht kenne. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |