【问题标题】:C header issue: #include and "undefined reference"C 标头问题:#include 和“未定义的引用”
【发布时间】:2012-05-08 14:01:45
【问题描述】:

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

谁能帮帮我?我真的坚持这一点,但我 99% 确定这是一个非常简单的解决方法。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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 */
      

      【讨论】:

      • 谢谢!那些让程序员大吃一惊的小事之一。 :)
      • 虽然标题保护是不必要的(在这个例子中)这是一个很好的提示
      • @user1018501:如果这个答案解决了你的问题,你应该接受它。
      • 那么不同的.c文件分别编译生成一个可执行文件?
      • @Xsmael 为了确保包括同一个 H 文件的多个 C 文件不会遇到在同一个程序中多次声明/定义相同标识符的问题。编译器使用“翻译单元”,这是一个 C 文件加上该 C 文件包含的所有头文件。这意味着同一个 H 文件可以存在于多个翻译单元中。
      【解决方案3】:

      您没有链接到 hello_world.c。

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

      cc -o main main.c hello_world.c

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

      【讨论】:

      • 是的,你绝对应该了解make(或者更好的构建系统,比如omake
      【解决方案4】:

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

         gcc hello_world.c main.c   -o main
      

      【讨论】:

        【解决方案5】:

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

        试试这个

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

        【讨论】:

          猜你喜欢
          • 2022-01-16
          • 2016-01-05
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          • 2021-06-18
          • 2019-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多