2012-10-03 19 views
9

ho questo semplice file di test:undefined reference to <nome funzione>

#include "stack.h" 

int main() 
{ 
    Stack* stck = init_stack(); 

    return 0; 
} 

e stack.h è definito come segue:

#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 

Questi due file sono nella stessa directory. Ma quando faccio gcc .. costruirlo, continuo a ricevere l'errore sotto:

$ 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 

Qualcuno potrebbe dirmi che cosa ho fatto di sbagliato?

Grazie,

+0

Come fa a sapere dove deve essere la definizione di "init_stack'? Anche se include C++, questa domanda probabilmente ti aiuterà: http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i- fix – chris

+5

Si noti che 'extern Stack * init_stack();' è una dichiarazione abbastanza diversa da 'extern Stack * init_stack (void); '. Il primo dice che c'è una funzione ma l'elenco degli argomenti non è specificato (non è una funzione di argomenti variabili, ma il numero e i tipi degli argomenti non sono specificati). Il secondo dice che la funzione non accetta argomenti. Non usare la notazione di parentesi vuota in C. Nota che in C++ le parentesi vuote significano '(void)'. –

+0

@ JonathanLeffler Oh, wow! Non l'ho mai saputo! Ho sempre pensato che '(void)' è solo il modo elegante di '()'. Grazie! – user1508893

risposta

17
gcc -o testit teststack.c stack.c 

È necessario compilare entrambi i file sorgenti C e collegare i file oggetto; questo fa tutto in un unico comando.

+0

Ho pensato che il '#include" stack.h "' dovrebbe occuparsene? No? – user1508893

+0

Devo aggiungere anche 'stack.h' nel comando' gcc'? – user1508893

+0

@ user1508893, Tutto ciò che include è essenzialmente incollarlo nel file incluso. 'stack.c' non può funzionare magicamente. – chris

Problemi correlati