Ich habe diese einfache Testdatei:undefined Verweis auf <function name>
#include "stack.h"
int main()
{
Stack* stck = init_stack();
return 0;
}
und stack.h
ist wie folgt definiert:
#ifndef STACK_H
#define STACK_H
#define EMPTY_STACK -1
typedef struct stack
{
char ch;
struct stack* prev;
} Stack;
extern Stack* init_stack();
extern char pop(Stack*);
extern void push(Stack*, char);
#endif
Diese beiden Dateien im selben Verzeichnis befinden. Aber wenn ich gcc ..
tun, es zu bauen, ich erhalte den Fehler unten:
$ ls
stack.c stack.h teststack.c
$ gcc -o testit teststack.c
/tmp/ccdUD3B7.o: In function `main':
teststack.c:(.text+0xe): undefined reference to `init_stack'
collect2: ld returned 1 exit status
Könnte mir jemand sagen, was ich hier falsch gemacht haben?
Danke,
Wie weiß es, wo die Definition von 'init_stack' zu verwenden ist? Obwohl es C++ enthält, wird Ihnen diese Frage wahrscheinlich helfen: http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i- fix – chris
Beachten Sie, dass 'extern Stack * init_stack();' eine ganz andere Deklaration als 'extern Stack * init_stack (void);' ist. Die erste sagt, es gibt eine Funktion, aber die Argumentliste ist nicht spezifiziert (es ist keine Funktion für variable Argumente, aber die Anzahl und Typen der Argumente sind nicht spezifiziert). Die zweite besagt, dass die Funktion keine Argumente annimmt. Verwenden Sie nicht die leere Klammernschreibweise in C. Beachten Sie, dass leere Klammern in C++ dasselbe bedeuten wie '(void)'. –
@ JonathanLeffler Oh, wow! Ich habe das niemals gewusst! Ich dachte immer, '(void)' ist nur der schicke Weg von '()'. Vielen Dank! – user1508893