2012-10-03 16 views
9

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,

+0

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

+5

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)'. –

+0

@ JonathanLeffler Oh, wow! Ich habe das niemals gewusst! Ich dachte immer, '(void)' ist nur der schicke Weg von '()'. Vielen Dank! – user1508893

Antwort

17
gcc -o testit teststack.c stack.c 

Sie müssen beide Dateien C-Quelle kompilieren und die Objektdateien zu verknüpfen; Das macht alles in einem Befehl.

+0

Ich dachte der '#include" stack.h "' sollte sich darum kümmern? Nein? – user1508893

+0

Muss ich 'stack.h' auch im' gcc'-Befehl hinzufügen? – user1508893

+0

@ user1508893, Alles inklusive das ist im Grunde einfügen es in der Include-Datei. 'stack.c' kann sich nicht magisch hineinarbeiten. – chris