汽车上使用的ECU中运行的程序,是软件工程师基于C/C++语言编写出来,然后通过编译器编译得到可执行文件,最后将可执行文件刷写入ECU中实现的,今天我们介绍下编译过程。
通常我们使用GCC编译器来实现编译,对于GCC编译器,我们就不展开介绍了,感兴趣的同学可以到网上找些材料,自行充电。
【公众号后台回复“高质量编程指南”获取pdf文档,100页干活,你不容错过!】
0 四个阶段
虽然我们称GCC是C语言的编译器,但使用GCC由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶
预处理(也称预编译,Preprocessing)
编译(Compilation)
汇编(Assembly)
链接(Linking)
GCC首先调用cpp进行预处理,在预处理过程中,对源代码文件中包含的预编译语句进行分析。然后调用编译器进行编译,这个阶段根据输入文件生成以.s为后缀的汇编文件。汇编过程是针对汇编语言的步骤,将.S为后缀的汇编语言源代码文件生成以.o为后缀的目标文件。当所有的目标文件都生成之后,GCC会完成最后的链接过程,最终生成可执行文件。
下面我们详细看看每个阶段。
1 预处理阶段
读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。那么,什么事伪指令呢?伪指令主要包括以下四个方面:(1)宏定义指令,如#define Demu 520,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Demu用520替换,但作为字符串常量的Demu则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。这些条件编译指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。(3)头文