C链接错误:对'main'的未定义引用

时间:2013-04-09 14:47:37

标签: c linker

我已经阅读了关于这个主题的其他答案,不幸的是他们没有帮助我。我试图将几个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;
}

有关为什么我会收到此错误的任何想法?谢谢!

4 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:5)

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

您需要添加它:

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

答案 2 :(得分:1)

您正在通过运行此命令覆盖目标文件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 将是您的二进制文件。

答案 3 :(得分:0)

通常,您可以通过以下方式编译大多数.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()