Keil MDK--几种编译方式的区别
前言
我相信使用Keil MDK的用户应该对以下几个图标都不陌生,但可能不是每个人都清楚这几个按钮的功能和异同,下面我会对这几个按键的功能进行一定说明。

1. Translate
在Keil MDK中,Translate操作包括了预处理(Preprocessing)、编译(Compiling)和汇编(Assembling)步骤,但不包括链接(Linking)。Translate仅对当前激活文件进行操作,例如,当双击main.c文件使得main.c处于激活状态后,点击Translate,将会生成以下几种文件:

- ._i 文件:
._i 文件是Keil MDK特有的中间文件,这些文件可能包含优化信息或其他编译器特定的数据,以支持增量编译;
- .crf 文件:
.crf 文件代表编译报告文件(Compilation Report File),包含了编译时间、编译选项、编译结果等详细信息;
- .d 文件:
.d 文件记录了源文件与其头文件依赖关系,允许增量编译器确定当头文件更改时哪些源文件需要重新编译;
- .o 文件:
.o 文件是目标文件(Object File),它们包含编译器生成的机器代码,但尚未链接成最终的可执行文件。每个源文件在编译后通常会生成一个对应的.o文件,这些文件随后会被链接器用来生成最终的可执行文件或库文件;
2. Build
在Keil MDK中,Build操作涵盖了将源代码转换成可执行文件的整个编译过程,包括:预处理(Preprocessing)、编译(Compiling)、汇编(Assembling)、链接(Linking)、生成可执行文件(Generating Executable)(可能还涵盖了:错误和警告检查、依赖性分析、优化、生成编译报告、清理旧的编译结果等)。
Build是一种增量编译方式,如果你的工程没有被编译过,那么Build操作将完整编译整个工程,这类似于Rebuild操作。当你编译过整个工程,并对当前工程的部分文件进行了修改,那么build操作将编译这次修改的文件及其依赖的文件。
增量编译方式可以有效提高编译的效率,让你不必等待太多的编译时间,但增量编译的使用是有一定限制的,如果随意使用增量编译,可能引入不必要的风险或者带来严重的错误。以下情况不推荐使用Build进行增量编译:
- 宏定义发生更改:依赖该宏定义的源文件没有被正常识别依赖,增量编译可能忽略对相关源文件的重新编译,导致部分关联的源文件使用的还是上一次的宏定义;
- 条件编译发生更改:如
#ifdef、#ifndef等,更改可能会影响条件编译的逻辑,导致错误的代码路径被包含或排除; - 项目设置发生更改:如目标平台、编译器设置、优化选项、预处理器定义或包含路径等项目配置发生更改
- 代码重构:进行了大规模的代码重构,影响到多个文件的结构和逻辑;
- 错误修复:修复了编译错误或警告,这可能需要重新编译以确保问题被彻底解决;
- 库文件更新:库文件文件的更新可能影响很多源文件;
3. Rebuild
Rebuild同样涵盖了整个编译 过程,并且该操作会重新编译项目中的所有文件,不管它们是否有修改,这确保了生成的可执行文件是最新的。
4. Batch Build
与Build和Rebuild每次只能编译一个项目不同,Batch Build允许编译一个工作空间(Workspace)中的多个项目。Batch Build可以通过设置Batch Setup来指定需要批量编译的工程,Batch Build编译完成后,会给出提示信息。



Batch Build还支持高程度自动化的场景,可以编写自动化脚本实现不打开 Keil 软件界面的自动化编译(后续补充)。
附录:Workspace
在Keil MDK中,Workspace是一个包含多个项目(Project)的集合,其后缀名通常为:.uvmpw。Workspace中的所有项目可以共享相同的工具链设置、库文件和配置,但每个项目都有其独立的源代码、宏定义和项目特定的设置,其优势还包括:
- 项目集合:一个工作空间可以包含多个项目,使得开发者可以在单个工作区中管理和切换不同的项目;
- 项目管理:在工程窗口(Project Window)中,可以显示工作空间下的所有工程项目内容,包括工程、组和源代码文件等;
- 项目创建:通过 “Project” 菜单中的 “New Multi-Project Workspace” 选项,可以创建一个新的工作空间,进而在其中添加或移除项目;
- 批量编译:
Workspace允许进行批量编译操作,即 “Batch Build”,这可以一次性编译工作空间中的所有项目或选定的项目集合; - 项目选项配置:在 “Project” 菜单中,可以对每个项目进行配置,包括选择目标设备、编译选项等;
- 工程目标选项:可以通过 “Options for Target” 对每个工程目标进行详细配置,包括编译器、链接器等设置;
- 多项目调试:在调试时,可以针对工作空间中的不同项目设置断点、单步执行等调试操作;
- 资源共享:在
Workspace中,不同的项目可以共享相同的资源,如工具链设置、库文件等,但每个项目都保持独立; - 导出和导入:可以导出(Export)和导入(Import)整个工作空间或单个项目,方便项目迁移和版本控制;
在Keil MDK中,你可以通过以下步骤创建一个Workspace:
菜单栏选择Project –> New Multi...,在弹出的对话框中选择Workspace存储位置及命名


在弹出的对话框中,选择你需要添加的所有项目

添加完毕后点击完成,接下来你就可以享用Workapce带来的Batch Build等特性啦~


