-
Notifications
You must be signed in to change notification settings - Fork 14
工具链 概念介绍
工具链,指一系列工具,之所以成为“链”,是由于这一套工具紧密联系,一步一步实现从编辑代码到最终成品的过程。
我们都知道,代码要被机器运行,需要被编译成机器语言。将高级语言(如 C 和 C++)编译到机器语言,是由编译器完成的。我们一般编写在本地运行的 C 或 C++ 程序,常见的编译器有 gcc(g++)、clang(clang++)等(Python 等解释语言使用解释器,无编译过程,在此不展开)。
编译器就是一个程序,它接收输入的代码文件,输出可执行文件,例如,我们在终端中敲入以下指令,便可以将 test.c 编译成可执行文件 test。
gcc test.c -o test
而在我们嵌入式开发中,代码编译的平台与实际运行的平台并不相同,此时就需要用到交叉编译,简单来说,就是在一个编译器运行的架构(你的电脑)和输出的可执行文件运行的架构(嵌入式开发板)不同。我们使用的交叉编译工具链是 ARM-NONE-EABI。
如果我们只有简单的几个文件需要编译,直接调用编译器即可。但是,当我们的工程规模逐渐扩大,各种文件之间产生了复杂的依赖关系,我们就需要借助其他工具,用于自动化调用编译器,以正确的顺序,编译必要的文件。一个简单的例子:当我们修改了一个文件,我们希望只重新编译依赖于这个文件的文件,而不是重新编译整个工程的数百个文件。Make 是一个常见的自动化工具,它会根据配置文件(Makefiles 等),分析文件的依赖关系,再调用编译器。Make 本身也是一个可以直接在终端中运行的程序。
当工程继续复杂化,Make 也无法胜任时,我们会使用其他更高层次的自动化工具,用于自动生成 Make 的配置文件,再调用 Make。这里,我们使用的是 CMake。编译的过程,就变成了 CMake - Make - ARM-NONE-EABI。对于用户而言,Make 和 ARM-NONE-EABI 的调用都是由 CMake 自动完成的。
除去编译的部分,在前端,我们需要编辑代码的工具,这里我们使用的是 CLion。CLion 是 IDE(Integrated Development Environment 集成开发环境),是辅助用户编写代码的程序,其中包含了代码检查、自动补全、代码重构、运行调试等功能。同时,它作为编译工具(CMake)和调试工具(GDB)与用户的中间层。
在后端,我们需要将编译好的可执行文件烧录到开发板上,我们使用 OpenOCD。除了程序烧录,OpenOCD 全称是 Open On-Chip Debugger ,是一个开源的单片机工具,配合仿真器(adapter,连接开发板和电脑的硬件,例如 ST-Link,J-Link)。除了烧录程序,OpenOCD 还可以配合 GDB 使用,用于调试程序。
总结起来我们使用的工具链包含:CLion - CMake - (Make) - ARM-NONE-EABI - OpenOCD
接下来,通过一系列文档,我们能够最终实现通过 CLion 一键编译程序、一键烧录程序,并使用 CLion 内置的调试窗口显示信息、实现 IDE 内的调试功能。请按如下顺序阅读:
- 工具链 概念介绍 (本文)
- 工具链 安装 Mac 或 工具链 安装 Win
- 工具链 工程配置
- 工具链 CMake 构建系统简介
- 工具链 CMake 进阶配置(可选)
- 工具链 调试 与 远程烧录程序(可选)
由于工具链配置步骤繁多、涉及多个工具和软件,且操作系统各有不同,此教程难以确保每次成功,但只需要配置好一次,以后便可以一直使用。在配置过程中请保持细心和耐心,如果遇到问题,请先仔细阅读文档确保操作正确,然后,不妨尝试借助 Google 等尝试自己解决问题,这是很好的锻炼解决问题能力、深入了解工具链内部机制的机会。当然,也欢迎反馈或直接对此文档进行修改。
- 2018.07.19 首次发布。 liuzikai
- 2018.11.10 文档重构。 liuzikai
- 2019.01.30 适配新 CMake 工具链。 liuzikai
- 2019.02.13 文档重构,增加了基础概念说明。 liuzikai
- 2021.07.07 更新工具链系列文档顺序。liuzikai
- 2022.01.17 修复一些 typo。liuzikai
- 基础知识
- 基础配置
- 进阶与参考