【问题标题】:C Linking Error: undefined reference to 'main'C 链接错误:未定义对“主”的引用
【发布时间】:2013-04-01 01:41:55
【问题描述】:

我已阅读有关此主题的其他答案,不幸的是他们没有帮助我。我正在尝试将几个 c 程序链接在一起,但我收到一个错误响应:

$ gcc -o runexp.o scd.o data_proc.o -lm -fopenmp
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: * [runexp] Error 1

我只有一个主要功能,它在 runexp 中。表格是

int main(void) {
    ...; 
    return 0;
}

对为什么我可能会收到此错误有任何想法吗?谢谢!

【问题讨论】:

  • 这个函数在全局范围内吗?
  • 您的 GCC 命令不包含 runexp.c,它会输出到 runexp.o - 确定您在 main 方法中包含源文件?

标签: c linker


【解决方案1】:

您应该在-o 选项之后提供输出文件名。在您的情况下,runexp.o 被视为输出文件名,而不是输入目标文件,因此您的 main 函数未定义。

【讨论】:

  • 或者干脆去掉-o选项,使用传统的./a.out,这个名字很漂亮;)
【解决方案2】:

编译时没有包含包含 main() 的 C 文件,因此链接器看不到它。

你需要添加它:

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp

【讨论】:

    【解决方案3】:

    您正在通过运行以下命令覆盖您的目标文件runexp.o

     gcc -o runexp.o scd.o data_proc.o -lm -fopenmp
    

    事实上,-o 是用于 输出 文件的。 你需要运行:

    gcc -o runexp.out runexp.o scd.o data_proc.o -lm -fopenmp
    

    runexp.out 将是你的二进制文件。

    【讨论】:

      【解决方案4】:

      一般你编译大多数.c文件的方式如下:

      gcc foo.c -o foo.它可能会有所不同,具体取决于您使用的#includes 或您是否有任何外部 .h 文件。一般来说,当你有一个 C 文件时,它看起来有点像下面这样:

      #include <stdio.h>
          /* any other includes, prototypes, struct delcarations... */
          int main(){
          */ code */
      }
      

      当我得到一个“未定义的 main 引用”时,通常意味着我有一个 .c 文件,该文件中没有 int main()。如果您第一次学习 java,这是一种可以理解的混淆方式,因为在 Java 中,您的代码通常如下所示:

      //any import statements you have
      public class Foo{
          int main(){}
       }
      

      我建议您查看顶部是否有int main()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2014-01-09
        相关资源
        最近更新 更多