对main的未定义引用 - collect2:ld返回1退出状态

时间:2011-11-01 10:56:34

标签: c gcc reference

我正在尝试编译一个程序(称为es3),但是,当我从终端写入时:

gcc es3.c -o es3

出现此消息:

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

我该怎么办?

7 个答案:

答案 0 :(得分:48)

这意味着es3.c没有定义main函数,并且您正在尝试从中创建可执行文件。可执行文件需要有一个入口点,因此链接器会抱怨。

要仅编译到目标文件,请使用-c选项:

gcc es3.c -c
gcc es3.o main.c -o es3

上面将es3.c编译为目标文件,然后编译包含main.c函数的文件main,并且链接器合并es3.o和{{1} }到一个名为main.o的可执行文件中。

答案 1 :(得分:12)

也许您的main功能已被注释掉,因为例如预处理。 要了解预处理正在做什么,请尝试gcc -C -E es3.c > es3.i,然后使用编辑器查看生成的文件es3.i(并在其中搜索main)。

首先,你应该总是(因为你是新手)用

编译
  gcc -Wall -g -c es3.c
  gcc -Wall -g es3.o -o es3

-Wall标志非常重要,您应该始终使用它。它告诉编译器给你(几乎)所有警告。并且您应该始终听取警告,即更正源代码文件es3.C,直到您不再收到警告为止。

-g标志也很重要,因为它要求gcc将调试信息放在目标文件和可执行文件中。然后,您可以使用调试器(如gdb)来调试程序。

要获取目标文件或可执行文件中的符号列表,可以使用nm

当然,我假设你使用的是GNU / Linux系统(如果你不使用它,我邀请你使用GNU / Linux。)

答案 2 :(得分:3)

目前尚未提及的一种可能性是您可能没有编辑您认为自己的文件。即你的编辑可能会有一个与你想象的不同的cwd。

运行'更多'在您正在编译的文件上,仔细检查它确实包含您希望它具有的内容。希望有所帮助!

答案 3 :(得分:2)

可执行文件需要主要功能。见下面的hello world演示。

#include <stdio.h>
int main(void)
{
        printf("Hello world!\n");
        return 0;
}

正如您所看到的,有一个主要功能。如果您没有此主函数,ld将报告“未定义的对主要参考”

检查我的结果:

$ cat es3.c
#include <stdio.h>
int main(void)
{
    printf("Hello world!\n");
    return 0;
}
$ gcc -Wall -g -c es3.c
$ gcc -Wall -g es3.o -o es3
~$ ./es3
Hello world! 

请使用$ objdump -t es3.o检查是否有主符号。以下是我的结果。

$ objdump -t es3.o

es3.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 es3.c
00000000 l    d  .text  00000000 .text
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss   00000000 .bss
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .rodata        00000000 .rodata
00000000 l    d  .debug_frame   00000000 .debug_frame
00000000 l    d  .debug_loc     00000000 .debug_loc
00000000 l    d  .debug_pubnames        00000000 .debug_pubnames
00000000 l    d  .debug_aranges 00000000 .debug_aranges
00000000 l    d  .debug_str     00000000 .debug_str
00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack
00000000 l    d  .comment       00000000 .comment
00000000 g     F .text  0000002b main
00000000         *UND*  00000000 puts

答案 4 :(得分:1)

在我的情况下,我发现缺少主函数声明的void

我以前在Windows中使用Visual Studio,这从来没有问题,所以我想我现在也可以不使用它。

答案 5 :(得分:0)

您只需添加main功能即可解决此问题。 就像:

int main()
{
    return 0;
}

答案 6 :(得分:0)

在我的情况下,这仅仅是因为我没有保存源文件,而是试图编译一个空文件。