2012-10-03 74 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-doi-i-修复 – 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

我是否也需要在'gcc'命令中添加'stack.h'? – user1508893

+0

@ user1508893,所有包括它基本上都将其粘贴到包含文件中。 'stack.c'不能奇迹般地工作。 – chris

相关问题