c语言为什么是第一步预处理,第二步编译,第三步汇编,第四步链接?
预处理
gcc -E helloworld.c -o helloworld_x86.i
编译
gcc -S helloworld_x86.i -o helloworld_x86.s
汇编
gcc -c helloworld_x86.s -o helloworld_x86.o
链接
gcc helloworld_x86.o -o helloworld_x86
C 语言是一种高级编程语言,在计算机中被看做是一种文本文件。编写的程序需要经过多个步骤才能够变成可执行文件在计算机上运行。这些步骤包括预处理、编译、汇编和链接。
预处理(Preprocessing):在这个阶段,C 语言编译器会对源代码进行文本替换和宏展开等处理。例如,将 #include 指令所引用的头文件内容插入到源代码中,或者如果代码中有宏定义,则将其展开成实际代码。这个阶段的输出是一个处理好的 C 源代码文件。
编译(Compilation):在这个阶段,编译器将汇编代码翻译成目标机器语言的二进制可执行文件。这个可执行文件通常是面向特定操作系统的,例如 Windows、Linux 等。这个阶段的输出是一个二进制的可执行文件,通常以 .exe 或 .out 为扩展名。
汇编(Assembly):在这个阶段,汇编器将文本格式的 C 语言源代码转化为机器语言的汇编代码。所得的汇编代码是面向特定计算机平台的,并且不能跨平台使用。这个阶段的输出是一个汇编代码文件,通常以 .s 或 .asm 为扩展名。
链接(Linking):在这个阶段,链接器将多个目标文件或库文件组合成一个单独的可执行文件。链接器会根据函数和变量的引用关系,将它们连接到相应的地址上。同时,还会检查代码是否有不一致的部分和缺失的符号等问题。这个阶段的输出是一个可以在操作系统中运行的完整的可执行文件。
以上四个步骤是按照顺序依次进行的,并且每个阶段都会依赖于前一个阶段的输出。因此,C 语言编译过程需要将这些步骤串联起来完成。这样就可以从源代码到最终可执行文件的全过程中逐步确定细节并找出错误。
在这个过程中,.o文件的产生是怎么来的?
在 C 语言的编译和链接过程中,产生了很多中间文件,其中就包括了 .o 文件。
.o 文件是编译器生成的一种中间文件,通常被称为目标文件(object file),它包含了代码的机器语言和相关符号表信息。在编译时,源代码会被编译成汇编代码,然后再被汇编器汇编成机器语言(二进制代码)。这些二进制代码和符号表信息被放在一个 .o 文件里,作为一组编译好的二进制文件(或者说是编译单元)。
在编译一个大型的程序时,通常会有很多个源代码文件需要被编译和链接在一起形成一个可执行文件。为了高效地完成这个工作,编译器通常会先分别对每个源代码文件进行编译,将输出结果保存到 .o 文件中。最后,链接器会将所有 .o 文件合并到一个可执行文件中。
当 .o 文件生成之后,可以随时被删除、修改或替换,只要它们的内容没有被使用到,就不会影响最终的可执行文件的生成。因此,.o 文件通常被用来提高编译速度和管理程序的结构,同时还可以避免每次修改源代码都重新编译整个程序的成本。
总结
预处理:#include
汇编:变为机器语言
编译:转为二进制可执行文件(对应所在的操作系统)
链接:让多个文件文件合并成一个.exe文件,使其在对应的操作系统上完成!
网友评论