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

noo*_*arp 43 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
Run Code Online (Sandbox Code Playgroud)

我能做什么?

Bla*_*iev 52

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

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

gcc es3.c -c
gcc es3.o main.c -o es3
Run Code Online (Sandbox Code Playgroud)

上述编译es3.c成目标文件,然后编译一个文件main.c将包含所述main功能,并且所述接头融合es3.omain.o进入叫做可执行es3.

  • 问题是我把main函数放在我的程序中..我不明白为什么它说没有主要功能......:/ (4认同)

Bas*_*tch 14

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

首先,你应该总是(因为你是一个新手)编译

  gcc -Wall -g -c es3.c
  gcc -Wall -g es3.o -o es3
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


小智 14

就我而言,这只是因为我没有保存源文件并试图编译一个空文件。


Dan*_*iel 7

可执行文件需要一个 main 函数。请参阅下面的 hello world 演示。

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

如您所见,有一个主要功能。如果你没有这个 main 函数,ld 会报告“对 main 的未定义引用”

检查我的结果:

$ 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! 
Run Code Online (Sandbox Code Playgroud)

请用于$ 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
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但我的程序中有 main 函数 :( 不明白为什么编译器不读取它 :( (2认同)