Linux编译c代码报错Undefined reference to main的解决方案

TIPS: 不想看心路历程的直接跳转最后

本来是完成老师布置的ICS作业中的这样一个问题:

Write a simple program that allocates memory using malloc() but forgets to free it before exiting. What happens when this program runs? Can you use gdb to find any problems with it? How about valgrind (again with the --leak-check=yes flag)?

​ 然后自己写了一个有mallocfree的代码准备测试一下结果:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *x = (int *) malloc(sizeof(int));
    *x = 1;
    printf("%d\n", *x);
    return 0;
}

​ 发现在Linux中调用gcc编译出错,显示:
在这里插入图片描述

​ 觉得很奇怪,因为代码中明明有main函数,并且反复编译反复报undefined reference to main这个错误,且不论我使用gcc还是g++,使用-g参数还是不使用都出现,说明不是偶然。于是向gpt求助:


GPT回复:

​ 看起来您遇到了一个奇怪的问题。错误信息表明编译器找不到 main 函数,这在一个包含 main 函数的文件中是不太可能发生的。

这种问题可能与编译器或编译环境有关。您可以尝试以下几种方法来解决这个问题:

  1. 检查文件名和路径:确保您的文件名为 forget_free.c,并且在当前目录中。或者,您可以在命令中使用文件的完整路径。

  2. 尝试重新编译:有时候,重新运行编译命令可以解决一些奇怪的问题。您可以尝试删除生成的可执行文件并重新运行编译命令。

  3. 使用绝对路径:尝试使用绝对路径来指定输出文件的位置。例如:gcc -g forget_free.c -o /path/to/forget_free

  4. 尝试其他编译器:如果可能的话,尝试使用其他编译器编译您的代码,例如 Clang (clang)。

如果以上方法都无法解决问题,您可能需要检查您的编译环境是否存在其他问题。您可以尝试重新安装或更新您的编译器,或者在其他计算机上尝试编译您的代码,以确定问题的根本原因。


于是一条一条的尝试:

  • 重新敲了一遍forget_free.c这个title,确保没有混入奇怪的不可编码的空字符。错误依旧存在,排除该情况

  • 重新编译无效。排除该情况

  • 使用绝对路径进行指定输出:在这里插入图片描述

    结果成功了,可执行文件输出。


    分析其原因可能如下:

    1. 编译器问题:某些编译器版本可能存在 bug 或者不兼容某些代码结构,导致无法正确地识别 main 函数。

    2. 环境问题:在特定的操作系统或编译环境中,可能会出现配置错误或兼容性问题,导致编译器无法正确地解析代码。

    3. 路径问题:在指定输出文件时,如果路径包含特殊字符或者存在错误,可能会导致编译器无法正确识别 main 函数。

    个人猜测是编译器有大病 抽风了。


2024年3月25日20:20 光速破案,感谢博客/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/…/…/…/x86_64-linux-gnu/Scrt1.o: in function '_start‘
真正解决了问题,之前的什么加上共享库 -shared什么的都没有任何作用。
报错说undefined reference to main看来确实没毛病…没保存代码确实没有main。

用Vscode跑的朋友们记得先点ctrl+s!!!

用Vscode跑的朋友们记得先点ctrl+s!!!

用Vscode跑的朋友们记得先点ctrl+s!!!

重要的事情说三遍。

  • 41
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值