【玩转MDK】MDK编译过程解析
注:本文主要内容来自野火STM32教程
1、MDK编译过程
在MDK工程下,点击编译按钮,MDK将会完成整个编译过程,如下图所示
编译,MDK 软件使用的编译器是 armcc 和 armasm,它们根据每个c/c++和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息;
链接,链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”;
格式转换,一般来说 Windows 或 Linux 系统使用链接器直接生成可执行映像文件 elf后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的 elf 映像文件利用格式转换器fromelf 转换成“.bin”或“.hex”文件,交给下载器下载到芯片的 FLASH 或 ROM 中。
2、编译过程实例解析
MDK工程下点击编译按钮,在MDK的“Build Output”窗口会看到编译过程信息
1、提示信息的第一部分说明构建过程调用的编译器。图中的编译器名字是“V5.06(build20)”,后面附带了该编译器所在的文件夹。在电脑上打开该路径,即\ARM\ARMCC\bin,可看到该编译器包含 armar、 armasm、 armcc、 armlink 及 fromelf,后面四个工具上面内容已有讲解,而 armar 是用于把.o 文件打包成 lib 文件的
2、使用 armasm 编译汇编文件。图中列出了编译 startup 启动文件时的提示,编译后每个汇编源文件都对应有一个独立的.o 文件
3、使用 armcc 编译 c/c++文件。图中列出了工程中所有的 c/c++文件的提示,同样地,编译后每个 c/c++源文件都对应有一个独立的.o 文件。
4、使用 armlink 链接对象文件,根据程序的调用把各个.o 文件的内容链接起来,最后生成程序的 axf 映像文件,并附带程序各个域大小的说明,包括 Code、 RO-data、 RW-data及 ZI-data 的大小。
5、使用 fromelf 生成下载格式文件,它根据 axf 映像文件转化成 hex 文件,并列出编译过程出现的错误(Error)和警告(Warning)数量。
6、最后一段提示给出了整个构建过程消耗的时间
编译完成后,可在工程的“Output”及“Listing”目录下找到由以上过程生成的各种文件,每个 C 源文件都对应生成了.o、 .d 及.crf 后缀的文件,还有一些额外的.dep、 .hex、 .axf、 .htm、 .lnp、 .sct、 .lst 及.map 文件