我们在大学课程上学习单片机时,会使用一个叫做Keil的工具,完成代码的编辑之后,可以通过点击几个按钮来选择编译,编译并且生成固件,重新编译并且生成固件,这三个是我们最常用的按钮,当时在上课时,很多老师并不会讲清楚三个按钮被点击后具体执行的过程,玩单片机也有两三年,今天大概谈一谈自己的理解。
举例几个常用的编辑器:
1、适用于x86的:gcc
2、适用于arm-linux的:arm-linux-gnueabihf-gcc
3、适用于esp32-idf环境下开发:xtensa-esp32-elf-cpp.exe
为了方便理解,我们使用linux下的gcc进行举例
linux在安装成功后,基本上都自带gcc/g++编译器,在命令行输入gcc/g++ -v可以查看当前版本,我们新建一个test.c文件,使用gcc test.c -o test进行最简单的编译,可以看到文件夹下生成了一个test可执行文件,在这个过程中,编译器对代码进行了以下四个步骤:

(1)预处理
C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。

(2)编译
编译就是把 C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码,所用到的工具为 cc1(它的名字就是 cc1,x86 有自己的 cc1 命令,ARM 板也有自己的 cc1 命令)。

(3)汇编
汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在 Linux 系统上一般表现为 ELF目标文件(OBJ 文件),用到的工具为 as。x86 有自己的 as 命令,ARM 版也有自己的 as 命令,也可能是 xxxxas(比如 arm-linux-as)。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。

(4)链接
链接就是将上步生成的 OBJ 文件和系统库的 OBJ 文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件,用到的工具为 ld 或 collect2。

未完待续