我正在尝试更深入地理解C编译,因此我正在编译和链接"手动".这是我的代码
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我放入我的控制台(Windows):
gcc -S main.c
as main.s -o main.o
ld main.o
Run Code Online (Sandbox Code Playgroud)
在尝试链接时,我得到:
main.o:main.c:(text+0x7): undefined reference to `__main'
Run Code Online (Sandbox Code Playgroud)
Zan*_*ynx 12
您没有链接任何必要的支持库.像stdin,stdout,stderr这样的C全局对象不仅仅是从无处出现.命令参数和环境变量从操作系统中提取.退出时,atexit()将调用所有这些函数,并将返回代码main传递给exit(return_code).等等.
看看命令gcc -dumpspecs,gcc -print-libgcc-file-name.查看该目录中的所有其他库.您会在dumpspecs的输出中找到很多引用的库和目标文件.我不知道究竟何时或如何解释这些规范规则,但你可能会得到这个想法.我认为,info gcc如果你深入挖掘,GCC信息页面会详细解释它.
info gcc 然后按'g'然后输入'Spec Files'
正如Jonathan Leffler所说,快捷方式是使用详细选项运行gcc:gcc -v并查看它使用的命令.