最近在学习MDK的编译,在这个过程中有一些收获,所以写了此博客和大家交流分享,如有错误,欢迎指正!
本文实验使用的是Autochip 的AC7801,主要参考了秉火的MDK的编译过程
1.C程序编译解析
C编程的基本策略是用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码),典型的C实现是通过编译和链接这两个步骤实现的。编译器把源代码转换为中间代码,链接器把中间代码和其他代码合并,生成可执行文件。
编译器首先将源代码转化为机器语言代码,并把结果放在目标代码文件(.obj文件、简称目标文件)中,虽然目标文件包含机器语言代码,但是并不能直接运行该文件。因为目标文件中存储的是编译器翻译的源代码,这还不是一个完整的程序。目标代码文件缺少启动代码(startup code),启动代码充当程序和操作系统之间的接口。目标代码还缺少库函数,几乎所有的C程序都要使用C标准库中的函数。
连接器的作用就是把你编写的目标代码、系统的标准启动代码和库代码这3部分合并为一个文件,即可执行文件,对于库代码,链接器只会把程序中要用到的库函数代码提取出来。
目标文件和可执行文件都是由机器语言指令组成的,然而,目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中,还包含了你编写程序中使用的库函数和启动代码的机器代码。
2.MDK编译过程
在单片机的平台上,除了编译、链接生成可执行程序外,还需要将可执行程序转换为 bin 或者 hex 文件:
编译: MDK使用的编译器是armcc和armasm,它们根据每个C/C++和汇编源文件成对应的以“ .o ” 为后缀名的对象文件(Object Code, 也称为目标文件)&#x