4、目标板与工具链配置:选择目标CPU架构(ARM/MIPS/x86)、配置外部工具链或使用Buildroot内置工具链、配置内核头文件版本
好,咱们接着往下走。上一章我们把Buildroot的目录结构和基本概念捋了一遍,这一章要动真格的了——配置目标板和工具链。
说实话,我第一次用Buildroot的时候,最头疼的就是这块。CPU架构选错了,工具链版本不匹配,内核头文件搞混了……编译出来的系统要么起不来,要么跑着跑着就崩了。嗯,今天我就把这些坑一个个给你指出来。
4.1 选择目标CPU架构
这一步是基础中的基础。你想想看,CPU架构选错了,后面所有工作都是白费。Buildroot支持的主流架构有ARM、MIPS、x86,还有RISC-V、PowerPC这些。
我个人习惯,先确认目标板子的CPU型号。比如你手头是树莓派,那就是ARM Cortex-A系列;如果是龙芯,那就是MIPS;如果是普通的PC机,那就是x86_64。
配置入口在 make menuconfig 的 Target options 菜单里:
Target options --->
Target Architecture (ARM (little endian)) --->
Target Binary Format (ELF) --->
Target Architecture Variant (cortex-a7) --->
Target ABI (EABIhf) --->
Floating point strategy (NEON/VFPv4) --->
这里有几个关键选项:
- Target Architecture:选ARM、MIPS还是x86。注意大小端,ARM默认小端,MIPS有大小端之分。
- Target Architecture Variant:具体到CPU型号。比如cortex-a7、cortex-a53、mips32r2这些。
- Target ABI:ARM下分EABI和EABIhf。EABIhf支持硬件浮点,性能更好。我建议能用就用EABIhf。
- Floating point strategy:浮点运算策略。有软件浮点和硬件浮点之分。选错了,程序跑起来慢得让你怀疑人生。
4.2 配置工具链
工具链,说白了就是编译器、链接器、库文件这些东西的集合。Buildroot给你两个选择:用内置的,或者用外部的。
4.2.1 使用Buildroot内置工具链
这是最省事的方式。Buildroot自己会下载源码,编译出一整套工具链。配置路径在 Toolchain 菜单:
Toolchain --->
Toolchain type (Buildroot toolchain) --->
Kernel Headers (Manually specified Linux version) --->
C library (glibc / uclibc / musl) --->
我个人推荐新手先用内置工具链。为什么呢?因为省心。你不需要自己去下载、配置外部工具链,Buildroot全帮你搞定。
但有个问题——编译时间很长。我第一次编译ARM工具链,用了将近两个小时。嗯,如果你电脑性能一般,可以考虑用外部工具链。
4.2.2 使用外部工具链
如果你已经有现成的工具链,比如Linaro提供的ARM交叉编译器,那就可以用外部工具链。配置方式:
Toolchain --->
Toolchain type (External toolchain) --->
Toolchain (Custom toolchain) --->
Toolchain path (/opt/arm-linaro-xxx)
Toolchain prefix (arm-linux-gnueabihf-)
External toolchain C library (glibc)
这里要注意几个点:
- Toolchain path:工具链的安装路径。必须是绝对路径。
- Toolchain prefix:编译器的前缀。比如
arm-linux-gnueabihf-,Buildroot会在后面自动加上gcc、g++这些。 - External toolchain C library:必须和你工具链里的C库一致。选错了,编译会报一堆链接错误。
https://releases.linaro.org/components/toolchain/binaries/ 下载。记得选对架构和ABI。
4.3 配置内核头文件版本
这个坑,我估计很多人跳过。内核头文件版本,说白了就是你的工具链里带的头文件,要和目标内核版本匹配。
为什么要匹配?因为头文件里定义了系统调用的接口、数据结构。如果版本不匹配,编译出来的程序可能调用了一些旧内核没有的系统调用,或者数据结构对不上。
配置位置:
Toolchain --->
Kernel Headers (Manually specified Linux version) --->
(4.19) Custom kernel headers version
我个人建议,内核头文件版本选和你目标内核版本一致,或者略低一点。比如你目标内核是5.10,那选5.10或者5.9都行。千万别选比目标内核高的版本。
ioctl 时老是返回错误。查了三天,最后发现是头文件里定义的结构体大小变了。从那以后,我再也不敢乱选头文件版本了。
4.4 知识体系总览
说了这么多,我画个图帮你理清思路。这一章的核心逻辑就是:先定CPU,再定工具链,最后定头文件版本。三者环环相扣。
4.5 实战建议
最后,给你几个实战中的建议:
- 第一次用Buildroot:选内置工具链,选glibc,头文件版本用默认的。先跑通再说。
- 如果编译报错:先检查CPU架构和变体有没有选对。这是最常见的错误来源。
- 如果程序跑起来崩溃:检查头文件版本和C库类型。我遇到过好几次,都是头文件版本不匹配导致的。
- 想省编译时间:用外部工具链。Linaro的ARM工具链,下载解压就能用,省去两小时编译时间。
核心要点: 目标板配置和工具链配置,是Buildroot项目的基础。基础不牢,地动山摇。花点时间把这一步搞对,后面会省很多事。
好了,这一章就到这里。配置好工具链之后,下一章我们会开始配置内核和文件系统。嗯,到时候再聊。
公众号:蓝海资料掘金营,微信deep3321