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)?
然后自己写了一个有malloc
无free
的代码准备测试一下结果:
#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
函数的文件中是不太可能发生的。
这种问题可能与编译器或编译环境有关。您可以尝试以下几种方法来解决这个问题:
-
检查文件名和路径:确保您的文件名为
forget_free.c
,并且在当前目录中。或者,您可以在命令中使用文件的完整路径。 -
尝试重新编译:有时候,重新运行编译命令可以解决一些奇怪的问题。您可以尝试删除生成的可执行文件并重新运行编译命令。
-
使用绝对路径:尝试使用绝对路径来指定输出文件的位置。例如:
gcc -g forget_free.c -o /path/to/forget_free
。 -
尝试其他编译器:如果可能的话,尝试使用其他编译器编译您的代码,例如 Clang (
clang
)。
如果以上方法都无法解决问题,您可能需要检查您的编译环境是否存在其他问题。您可以尝试重新安装或更新您的编译器,或者在其他计算机上尝试编译您的代码,以确定问题的根本原因。
于是一条一条的尝试:
-
重新敲了一遍
forget_free.c
这个title,确保没有混入奇怪的不可编码的空字符。错误依旧存在,排除该情况 -
重新编译无效。排除该情况
-
使用绝对路径进行指定输出:
结果成功了,可执行文件输出。
分析其原因可能如下:
-
编译器问题:某些编译器版本可能存在 bug 或者不兼容某些代码结构,导致无法正确地识别
main
函数。 -
环境问题:在特定的操作系统或编译环境中,可能会出现配置错误或兼容性问题,导致编译器无法正确地解析代码。
-
路径问题:在指定输出文件时,如果路径包含特殊字符或者存在错误,可能会导致编译器无法正确识别
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
!!!
重要的事情说三遍。