对main的未定义引用 – collect2:ld返回1退出状态
我正在尝试编译一个程序(称为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
我能做什么?
这意味着es3.c
没有定义main
函数,并且您正在尝试从中创建可执行文件。 可执行文件需要有一个入口点,因此链接器会抱怨。
要仅编译到目标文件,请使用-c
选项:
gcc es3.c -c gcc es3.o main.c -o es3
上面将es3.c
编译为目标文件,然后编译包含main
函数的文件main.c
,链接器将es3.o
和main.o
合并到一个名为es3
的可执行文件中。
也许您的main
function已被注释掉,因为例如预处理。 要了解正在进行的预处理,请尝试使用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)。
可执行文件需要一个main函数。 请参阅下面的hello world演示。
#include int main(void) { printf("Hello world!\n"); return 0; }
如您所见,有一个主要function。 如果您没有此主函数,ld将报告“未定义的主要参考”
检查我的结果:
$ cat es3.c #include 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 ld .text 00000000 .text 00000000 ld .data 00000000 .data 00000000 ld .bss 00000000 .bss 00000000 ld .debug_abbrev 00000000 .debug_abbrev 00000000 ld .debug_info 00000000 .debug_info 00000000 ld .debug_line 00000000 .debug_line 00000000 ld .rodata 00000000 .rodata 00000000 ld .debug_frame 00000000 .debug_frame 00000000 ld .debug_loc 00000000 .debug_loc 00000000 ld .debug_pubnames 00000000 .debug_pubnames 00000000 ld .debug_aranges 00000000 .debug_aranges 00000000 ld .debug_str 00000000 .debug_str 00000000 ld .note.GNU-stack 00000000 .note.GNU-stack 00000000 ld .comment 00000000 .comment 00000000 g F .text 0000002b main 00000000 *UND* 00000000 puts
到目前为止尚未提及的一种可能性是您可能没有编辑您认为自己的文件。 也就是说,你的编辑可能会有一个与你想象的不同的cwd。
在您正在编译的文件上运行’more’以仔细检查它确实具有您希望它执行的内容。 希望有所帮助!
您只需添加一个main
函数来解决此问题。 就像:
int main() { return 0; }
我的情况我发现缺少主函数声明的void
。
我以前在Windows中使用Visual Studio,这从来都不是问题,所以我想我现在也可以把它留下来。