关于程序预编译-编译-链接过程分析

本文详细介绍了程序从源代码到可执行文件的整个编译流程,包括预处理、编译和链接三个关键步骤。预处理阶段涉及宏定义的展开及头文件的包含;编译阶段则是将处理过的源代码转换为二进制形式的对象文件;链接阶段则是将这些对象文件组合起来形成最终的可执行文件。

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

0、前言

    之前自己在学习C语言时,都是在VS ,KEIL这类windows下的IDE进行的。所以之前虽然也知道程序由代码转为可执行文件的过程,但是一直没有深刻的理解。最近在linux系统中进行了几次编程,只能使用toolchain进行编译,也因此对程序预编译-编译-链接过程终于有了一些概念。所以说IDE虽然好,但是会让人丧失很多深入学习的机会啊!好了,废话不说,下面开始正题。


1、预处理(Pre-Process):

    也成预编译。又预处理器(预编译器)执行。总的来说就是讲一些技巧性的东西去掉或替换,为编译器留下纯粹的source。主要处理以下几种情况。

    1)宏定义: 比如将代码中的PI换为3.14等等。如:

    #define PI         3.14
    #define GPIOJ0     *(volatile unsigned int*(0xE0002000))

    2)include头文件。如:

#include <stdio.h>
#include "led.h"

    3)将注释去掉后送给编译器


2、编译(Compile)

    编译实际上就是将预处理过得.c, .s文件生成 .o文件的过程(中间还包括了汇编过程, .o文件已经是二进制代码了)。编译的进行是分立的。比如说在你的工程中有main.c, helloworld.c 甚至还有fxxk.s这种汇编文件。那么每一个source都会经过编译输出自己的.o文件。并且每一个source中的各个函数在各个.o文件中也是一块一块的。如下图所示。


所以说为什么我们编程时是以函数为单位的,因为编译时他也是以函数为单位的呀!每个函数都会编译成一个集体。


3、链接(link)

    由链接器执行。至关重要的一步,将.o文件中各个函数段按照一定的顺序和规则累积叠加在一起,生成最后的可执行文件。拿上面的图片说话,可能会生成如下顺序。



4、总结    

    如果那做菜来比喻,预处理就像是洗菜,编译就像是把各种材料切好了放在菜板上,而链接就是把各部分材料按照顺序下锅的过程。最后炒出来一盘可以吃的菜,就是我们的可执行文件啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值