2012-10-03 6 views
9

У меня есть этот простой тестовый файл:неопределенная ссылка на <имя функции>

#include "stack.h" 

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

    return 0; 
} 

и stack.h определяется следующим образом:

#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 

Эти два файла находятся в одном каталоге. Но когда я gcc .. построить его, я получаю ошибку ниже:

$ 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 

Может кто-нибудь сказать мне, что я сделал не так?

Спасибо,

+0

Как узнать, где должно использоваться определение 'init_stack', которое должно использоваться? Хотя он включает в себя C++, этот вопрос, вероятно, поможет вам: http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i- fix – chris

+5

Обратите внимание, что 'extern Stack * init_stack();' - совсем другое объявление из 'extern Stack * init_stack (void);'. Первый говорит, что есть функция, но список аргументов не указан (это не переменная функция аргументов, но количество и типы аргументов не указаны). Второй говорит, что функция не принимает аргументов. Не используйте пустую запись в скобках в C. Обратите внимание, что в C++ пустые круглые скобки означают то же самое, что и '(void)'. –

+0

@JonathanLeffler О, ничего себе! Я этого никогда не знал! Я всегда считал, что '(void)' просто причудливый способ '()'. Благодаря! – user1508893

ответ

17
gcc -o testit teststack.c stack.c 

Вы должны компилировать как C исходные файлы и скомпоновать объектные файлы; это делает все в одной команде.

+0

Я думал, что '#include" stack.h "' должен позаботиться об этом? Нет? – user1508893

+0

Нужно ли добавлять 'stack.h' в' gcc'-command тоже? – user1508893

+0

@ user1508893, все включая это делает, в основном вставляют его в файл, включающий в себя. 'stack.c' не может магически работать. – chris

Смежные вопросы