首页 > 版块 > STM32 > 帖子正文

MDK中Buil/ReBuild背后你不知道的故事

蔡琰 发布于 2021-10-13 17:41
收藏 0 回复 0 浏览 70 原创

在程序开发过程中,大家都会去点击编译按钮,直接开始仿真调试,基本上不怎么关注编译和链接的过程,因为我们使用的工具一般都是厂家做好的集成开发环境(IDE),比如MDK、IAR等。IDE通常将编译和链接合并到一起,虽然 IDE 提供的默认配置、编译和链接参数对于大部分应用程序来说已经足够使用了,但是作为学习,我们可以弄清楚从源代码生成可执行文件的原理。


    事实上,从源代码生成可执行文件可以分为四个步骤,分别是预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。下图是生成可执行文件的过程:

1.jpg     

预处理(Preprocessing)过程主要是处理程序中以#开头的命令,比如 #include、#define等。预处理的规则一般如下:

1.将程序中所有的#define宏定义进行替换。

2.处理程序中所有条件编译命令,比如 #if、#ifdef、#elif、#else、#endif 等。

3.处理#include命令,会将被包含的头文件的内容插入到该预处理命令所在的位置,需要注意的是,这个过程是递归进行的,也就是说被包含的头文件中还可能会包含其他的头文件。

4.删除程序中的注释。

5.添加行号和文件名标识,便于在调试和出错时给出具体的代码位置。

6.保留程序中的#pragma命令,因为编译器需要使用它们。


     预处理的结果是生成.i文件。.i文件也包含C语言代码的源文件,只不过所有的宏已经被展开,所有包含的文件已经被插入到当前文件中。当你无法判断宏定义是否正确,或者文件包含是否有效时,可以查看.i文件来确定问题。


    编译(Compilation)就是把预处理完的文件进行一些列的词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件(.txt文件)。编译是整个程序构建的核心部分,也是最复杂的部分之一,涉及到的算法较多。


在MDK中可以按照以下步骤生产预处理文件和编译文件。勾选之后,再重新Build或者ReBuild就可以了。


         2.jpg


汇编(Assembly)的过程就是将上一步生成的汇编指令转换成可以执行的机器指令。汇编过程相对于编译来说比较简单,只是根据汇编语句和机器指令的对照表翻译就可以了。汇编的结果是产生目标文件,即为.o文件。


目标文件已经是二进制文件,与可执行文件的形式类似,只是有些函数和全局变量都是分散的,地址还没有找到,程序不能执行。链接(Linking)的作用就是找到这些目标地址,将所有的目标文件组织成一个可以执行的二进制文件。


   以上就是你点击了MDK中的Buil/ReBuild之后,被雪藏的背后的过程,你清楚了吗?

0 0
发表评论 侵权投诉
评论 (0)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。

文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。