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

未定义对main-collect2的引用:ld返回1退出状态,c,gcc,reference,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 我能做什么?这意味着es3.c没有定义main函数,您正试图从中创建一

我试图编译一个程序(称为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
的可执行文件中。请参阅下面的hello world演示

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

可能由于预处理等原因,
main
函数已被注释掉。 要了解预处理在做什么,请尝试
gcc-C-ees3.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,我邀请您使用它)。

到目前为止还没有提到的一种可能性是,您可能没有编辑您认为是的文件。i、 你的编辑可能有一个不同于你想象的cwd


对正在编译的文件运行“more”,以仔细检查它是否确实包含您希望的内容。希望有帮助

您只需添加一个
main
函数即可解决此问题。 就像:

int main()
{
    return 0;
}

在我的案例中,我发现主函数声明的
void
缺失


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

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

感谢您的回答,但我的程序中有一个主要功能:(不理解编译器为什么不读取它:(我已经在我的linux上验证过了,请检查一下。我相信你没有真正的main;它是模糊的,被预处理器跳过,是内部的还是静态的……试着缩进你的文件,你会更容易阅读…@Basile Starynkevitch:我有一个main。但我认为BrandoSK没有main函数。你认为呢?是的,我是与原始海报相比,BrandoSK达到了顶峰。当编译器说no
main
时,他应该信任编译器!!问题是我把main函数放在了我的程序中..我不明白为什么它说没有main函数..。:/post导致此错误的代码可能是一个好主意。@BrandoSK:当我遵循该链接时,我得到了一个45秒倒计时。将代码作为问题的一部分发布,或者将其缩小到一个小示例中,说明问题并发布。好的,我刚刚下载了您的源文件。(1)它的名称是
es3\u f3.c
,而不是
es3.c
(2)它包含多个错误,例如第18行缺少分号。它不可能已编译,这意味着您无法看到您报告的链接器错误。向我们展示您的真实代码。(下载的源文件有73行,足够短,可以直接在此处发布。)您显示的错误消息与我对未定义
main
函数的源文件使用命令
gcc es3.c-o es3
时得到的错误消息非常相似。无论您真正编译的源文件是什么,都没有定义
main
函数。可能是您搞砸了编译器的安装,或者您想要一些。请检查你是的,我正在使用Ubuntu!我会去试试你说的话,谢谢..!O.P.有一个
main
函数。在我的例子中,我先将文件从一个目录打开到gedit,然后将其移动到另一个目录,然后尝试从我最近移动的新目录编译。但是文件是空的,因为它已经打开了。
  gcc -Wall -g -c es3.c
  gcc -Wall -g es3.o -o es3
int main()
{
    return 0;
}