我正在尝试编译一个程序(称为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
我该怎么办?
答案 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)
在我的情况下,这仅仅是因为我没有保存源文件,而是试图编译一个空文件。