编译和链接--被隐藏了的过程

本文详细介绍了C语言 HelloWorld 程序的编译过程,包括预处理、编译、汇编和链接四个阶段。预处理处理宏定义、头文件、注释等;编译阶段将预处理后的代码转换为汇编代码;汇编阶段将汇编代码转化为机器指令;链接阶段整合所有模块,生成可执行文件。这一过程对于理解程序是如何从源代码变为可执行程序至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于每一门语言来说。“Hello World”程序几乎是一个开始,每个程序员闭着眼睛都能写得出来。

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

在Linux下,当我们使用GCC来编译Hello World程序时,只需要使用最简单的命令(假设源代码文件名为hello.c):

#gcc hello.c

#./a.out

hello world

事实上,对于上述过程可以分为四个过程,预处理(Prepressing)、编译(Compliation)、汇编(Assembly)和链接(Linking)。

1.预编译 (Prepressing)

经过预编译的结果:hello.c ------> hello.i

即首先将源代码文件hello.c和相关的头文件,如stdio.h等预编译器cpp预编译成为一个.i文件。而与编译过程主要处理那些源代码中的以“#”开始的预编译指令,主要任务如下:

  • 将所有的“#define”删除,并且展开所有的宏定义。
  • 处理所有条件预编译指令,比如“#if”,“#ifdef”,“#elif”,“#else”,“endif”。
  • 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
  • 删除所有的注释“//”和“/*”。
  • 添加行号和文件名标识,比如#2“hello.c”2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
  • 保留所有的#pragma编译器指令,因为编译器须要使用它们。

2.编译 (Compliation)

经过编译的结果:hello.i ------> hello.s

编译过程就是把与处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分。

3.汇编(Assembly)

经过汇编的结果:hello.s ------> hello.o

汇编器是将汇编代码转变为机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,不需要复杂的语法、语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了。

4.链接(Linking)

 经过链接的结果:hello.o ------> a.out

链接的主要内容就是将各个模块之间相互引用的部分都处理好,是的各个模块之间能够正确的衔接。最终将一大堆文件链接起来得到”a.out“,即最终的可执行文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十七^O^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值