2012-10-03 34 views
9

que tiene este archivo de prueba sencilla:referencia indefinida a <nombre de función>

#include "stack.h" 

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

    return 0; 
} 

y stack.h se define de la siguiente manera:

#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 

Estos dos archivos están en el mismo directorio. Pero cuando lo haga gcc .. para construirlo, sigo obteniendo el error abajo:

$ 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 

Podría alguien decirme lo que hice mal?

Gracias,

+0

¿Cómo sabe dónde debe estar la definición de 'init_stack' que se debe usar? Aunque incluye C++, esta pregunta probablemente lo ayude: http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i- corregir – chris

+5

Tenga en cuenta que 'extern Stack * init_stack();' es una declaración bastante diferente de 'extern Stack * init_stack (void);'. El primero dice que hay una función, pero la lista de argumentos no está especificada (no es una función de argumentos variables, pero el número y los tipos de los argumentos no están especificados). El segundo dice que la función no toma argumentos. No use la notación de paréntesis vacía en C. Tenga en cuenta que en C++, los paréntesis vacíos significan lo mismo que '(void)'. –

+0

@JonathanLeffler ¡Oh, guau! ¡Nunca lo supe! Siempre pensé '(nulo)' es simplemente la forma elegante de '()'. ¡Gracias! – user1508893

Respuesta

17
gcc -o testit teststack.c stack.c 

Se necesita compilar los dos archivos de código fuente C y vincular los archivos de objetos; esto lo hace todo en un solo comando.

+0

Pensé que el '#include" stack.h "' debería encargarse de eso? ¿No? – user1508893

+0

¿Debo agregar 'stack.h' en el comando' gcc'-también? – user1508893

+0

@ user1508893, Todo lo que incluye es básicamente pegarlo en el archivo incluido. 'stack.c' no puede funcionar mágicamente. – chris