使用 Keil 编译 C 语言文件时,从 .c
文件到最终的 .bin
文件的生成过程是这样的:
1. 预处理阶段 (.c -> .i 文件):
-
在编译开始时,Keil 会首先进行 预处理。这个阶段包括:
-
处理所有的宏定义(例如
#define
)、文件包含(例如#include
)和条件编译指令(例如#ifdef
)。 -
预处理之后,编译器会生成一个
.i
文件,这个文件包含了处理后的 C 源代码,已经包含了所有的头文件和宏展开。
-
2. 编译阶段 (.i -> .s 文件):
-
接下来,编译器 将预处理后的
.i
文件转换成 汇编语言。这个过程的输出是.s
文件,其中包含了目标平台的汇编代码。汇编代码是人类可读的,但它仍然是面向特定处理器架构的低级指令。
3. 汇编阶段 (.s -> .o 文件):(这里gcc对应.obj文件)
-
在 汇编阶段,汇编器(Assembler)会将
.s
文件转换成机器语言,即 目标代码。这个过程的输出是.o
文件(目标文件)。目标文件包含了机器码,但它还不能直接执行,因为它还需要链接阶段的处理。
4. 链接阶段 (.o -> .axf 文件):(这里gcc对应.elf文件)
-
在 链接阶段,链接器(Linker)将多个
.o
文件(目标文件)和所需的库文件链接成一个完整的可执行文件。在 Keil 中,通常会生成一个.axf
文件(ARM Executable File)。 -
.axf
文件是Keil的标准可执行文件格式,包含了所有程序代码、数据、符号表等信息。它可以在调试过程中使用,并且用于烧录到嵌入式设备中。
5. 生成 .bin 文件:(这里gcc对应.hex文件)
-
最后,如果需要生成纯二进制格式的文件,Keil 会使用 转换工具(例如
fromelf
)将.axf
文件转换成.bin
文件。这个文件是纯粹的二进制代码,去除了所有调试和符号信息,只包含程序的机器码部分。 -
命令示例(在Keil中使用
fromelf
):fromelf --bin program.axf --output program.bin
总结:
整个流程是:
-
.c
文件 预处理生成.i
文件 -
.i
文件 编译生成.s
文件 -
.s
文件 汇编生成.o
文件 -
.o
文件 链接生成.axf
文件 -
最后使用
fromelf
或类似工具生成.bin
文件(纯二进制文件)
这个流程适用于嵌入式开发环境,特别是使用 Keil 的 ARM 开发板。