36

好吧,我一直在尝试使用这个最长的时间,但我似乎无法让它正常工作。我有三个文件,main.c,hello_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 主要
/tmp/ccSRLvFl.o:在函数“main”中:
main.c:(.text+0x5): undefined reference to `hello_world'
collect2: ld 返回 1 个退出状态
make: *** [main] 错误 1

任何人都可以帮助我吗?我真的坚持这一点,但我 99% 确定这是一个非常简单的解决方法。

4

5 回答 5

50
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 */
于 2012-04-27T20:07:54.363 回答
9

您没有在编译中包含 hello_world.c。

   gcc hello_world.c main.c   -o main
于 2012-04-27T20:08:10.807 回答
5

您没有链接到 hello_world.c。

一个简单的方法是运行这个编译命令:

cc -o main main.c hello_world.c

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

于 2012-04-27T20:08:43.507 回答
4

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

试试这个

cc -c main.c
cc -c hello_world.c
cc *.o -o hello_world
于 2012-04-27T20:07:12.920 回答
1

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

于 2012-04-28T08:44:18.407 回答