undefined reference
-
Hallo,
ich habe ein kleines c-programm mit ein paar funktionen geschrieben, die ich zuerst alle in eine datei geschrieben habe. Dann hab ich die funktionen vom hauptprogramm getrennt und in eine eigene datei geschrieben. Die funktions-prototypen habe ich in eine header-datei geschrieben, mit einem extern versehen und die header-datei in beide quelltextdateien includiert. Trotzdem ist jeder aufruf einer der besagten funktionen eine undefined reference.Anfang von main4.c
# include <stdio.h> # include <stdlib.h> # include "vok.h" . . .
Anfang von vok.c
# include <stdio.h> # include <stdlib.h> # include "vok.h" . . .
vok.h
# include <stdio.h> # include <stdlib.h> struct wort { struct wort *nxt; char name[100]; }; struct vokabel { struct wort *first; struct wort *last; char name[100]; }; extern struct vokabel *vok_construct(); extern int vok_put( struct vokabel *vok, char str[]); extern int vok_get( struct vokabel *vok, char str[]); extern void vok_show(struct vokabel *vok, int modus, FILE *pf); extern struct vokabel *vok_copy(struct vokabel *vok); extern void vok_destruct( struct vokabel *vok);
-
wenn du in vok.h schon stdio und stdlib includiert hast, musst dus nicht nochmal in
deinen .c-Dateien machen!
-
Mr 08/15 schrieb:
Dann hab ich die funktionen vom hauptprogramm getrennt und in eine eigene datei geschrieben. Die funktions-prototypen habe ich in eine header-datei geschrieben, mit einem extern versehen und die header-datei in beide quelltextdateien includiert. Trotzdem ist jeder aufruf einer der besagten funktionen eine undefined reference.
Soweit alles richtig. Wahrscheinlich wird vok.obj nicht zu deiner exe gelinkt. ( wenn du eine IDE verwendest muss vok.c ins Projekt )
Kurt
-
Turbo Locke schrieb:
wenn du in vok.h schon stdio und stdlib includiert hast, musst dus nicht nochmal in
deinen .c-Dateien machen!braucht nicht in den .c-Dateien zu inkludieren, tun kann er es trotzdem.
Ich würde an deiner Stelle 1. Header-guards einbauen
/* vok.h */ #ifndef IRGENDWASHIER #define IRGENDWASHIER /* den gesamten Inhalt der Header Datei */ #endif
2. entferne das 'extern' von den Funktionsprototypen, das brauchst du nicht, weil diese Funktionen und keineVariable sind und der Linker sich darum kümmert, wo die Teile sind. In vok.c musst du die Funktionien implementieren und in main4.c nur die Header Datei einbinden (hast bereits getan). Erst der Linker schaut sich in den obj-Filee (bzw. .o Dateien) und sucht nach den Funktionen.
@ZuK: muss nicht unbedingt eine "EXE" sein, es könnte sich um eine ELF-Binaray unter einem Posix-System
-
supertux schrieb:
2. entferne das 'extern' von den Funktionsprototypen, das brauchst du nicht, weil diese Funktionen und keineVariable sind und der Linker sich darum kümmert, wo die Teile sind.
Schadet aber auch nicht.
supertux schrieb:
@ZuK: muss nicht unbedingt eine "EXE" sein, es könnte sich um eine ELF-Binaray unter einem Posix-System
Wollte eigentlich executable schreiben. Habe mich dann doch für .exe entschieden.
(denke wir wissen was gemeint ist )
Kurt
-
Es lag tatsächlich daran, dass ich vok.c nicht ins projekt aufgenommen habe.
Soweit alles richtig. Wahrscheinlich wird vok.obj nicht zu deiner exe gelinkt.( wenn du eine IDE verwendest muss vok.c ins Projekt )
Allerdings wollte ich dann noch fragen wie man denn vok.obj zu der executable linkt, wenn man zum beispiel den gcc compiler benutzt.
-
gcc main4.c voc.c -o myexe
-
gcc linkt automatisch
gcc file1.o file2.o file3.o .... -o outputfile
gcc linkt in diesem Fall automatisch (bzw. lässt vom Linker selber linken)
-
Ok, damit wäre auch das gelöst.
Thx an alle die geantwortet haben.