C头问题:#include和“未定义引用”

时间:2012-04-27 20:04:40

标签: c gcc header header-files undefined-reference

好吧,我一直在尝试使用它的时间最长,我似乎无法让它正常工作。我有三个文件,main.chello_world.chello_world.h。无论出于何种原因,他们似乎没有很好地编译,我真的无法弄清楚为什么......

这是我的源文件。首先是hello_world.c:

#include <stdio.h>
#include "hello_world.h"

int hello_world(void) {
  printf("Hello, Stack Overflow!\n");
  return 0;
}

然后是hello_world.h,简单:

int hello_world(void);

最后是main.c:

#include "hello_world.h"

int main() {
  hello_world();
  return 0;
}

当我把它放入GCC时,这就是我得到的:

cc     main.c   -o main
/tmp/ccSRLvFl.o: In function `main':
main.c:(.text+0x5): undefined reference to `hello_world'
collect2: ld returned 1 exit status
make: *** [main] Error 1

有人能帮帮我吗?我真的坚持这个,但我99%肯定这是一个非常简单的修复。

5 个答案:

答案 0 :(得分:38)

gcc main.c hello_world.c -o main

此外,始终使用标题保护:

#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H

/* header file contents go here */

#endif /* HELLO_WORLD_H */

答案 1 :(得分:8)

您未在编译中包含hello_world.c。

   gcc hello_world.c main.c   -o main

答案 2 :(得分:5)

您没有链接到hello_world.c。

执行此操作的简单方法是运行此编译命令:

cc -o main main.c hello_world.c

更复杂的项目通常使用构建脚本或制作分隔编译和链接命令的文件,但上述命令(结合两个步骤)对小项目应该没问题。

答案 3 :(得分:4)

您应该将第二个.c文件hello_world.c中编译的目标文件与您的main.o链接

试试这个

cc -c main.c
cc -c hello_world.c
cc *.o -o hello_world

答案 4 :(得分:1)

雅似乎你忘了链接hello_world.c。 我将是gcc hello_world.c main.c -o main。如果文件数量较少,我们可以使用此方法,但在较大的项目中,最好使用Make文件或某些编译脚本。