我正在尝试编译一个程序(称为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.o和main.o进入叫做可执行es3.
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).
可执行文件需要一个 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)