2012-10-03 33 views
9

Tôi có tập tin này đơn giản kiểm tra:tài liệu tham khảo không xác định đến <function name>

#include "stack.h" 

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

    return 0; 
} 

stack.h được định nghĩa như sau:

#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 

Hai tập tin nằm trong cùng thư mục. Nhưng khi tôi làm gcc .. để xây dựng nó, tôi tiếp tục nhận được báo lỗi dưới đây:

$ 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 

bất cứ ai có thể cho tôi biết những gì tôi đã làm sai ở đây?

Cảm ơn,

+0

Làm cách nào để biết định nghĩa của 'init_stack' được sử dụng là gì? Mặc dù nó bao gồm C++, câu hỏi này có thể sẽ giúp bạn: http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i- sửa chữa – chris

+5

Lưu ý rằng 'extern Stack * init_stack();' là một khai báo khá khác với 'extern Stack * init_stack (void);'. Việc đầu tiên nói có một chức năng nhưng danh sách đối số không được chỉ định (nó không phải là một hàm đối số biến, nhưng số lượng và kiểu của các đối số không được chỉ định). Thứ hai nói rằng hàm không có đối số. Không sử dụng ký hiệu ngoặc đơn trống trong C. Lưu ý rằng trong C++, dấu ngoặc đơn trống có nghĩa là giống như '(void)'. –

+0

@JonathanLeffler Oh, wow! Tôi không bao giờ biết rằng! Tôi luôn luôn nghĩ rằng '(void)' chỉ là cách ưa thích của '()'. Cảm ơn! – user1508893

Trả lời

17
gcc -o testit teststack.c stack.c 

Bạn cần phải biên dịch cả file nguồn C và liên kết các tập tin đối tượng; điều này làm tất cả trong một lệnh.

+0

Tôi nghĩ '#include 'stack.h" 'nên xử lý nó? Không? – user1508893

+0

Tôi có cần thêm 'stack.h' vào lệnh' gcc' không? – user1508893

+0

@ user1508893, Tất cả bao gồm điều đó về cơ bản là dán nó vào tệp bao gồm. 'stack.c' không thể làm việc theo cách kỳ diệu. – chris

Các vấn đề liên quan