一、文章背景
疑惑
官方提供的SDK包的结构如下:
hugo@hugo-virtual-machine:~$ tree -L 2 SDK
SDK
├── environment-setup-aarch64-poky-linux
├── site-config-aarch64-poky-linux
├── sysroots
│ ├── aarch64-poky-linux
│ ├── aarch64-poky-linux.tar.gz
│ └── x86_64-pokysdk-linux
└── version-aarch64-poky-linux
这里的每个包是用来干嘛的?为什么SDK下的 sysroots有aarch64-poky-linux和x86_64-pokysdk-linux,这两个包分别是干嘛的,这个aarch64是什么意思?x86又是什么意思?这里的pokysdk是什么意思?为什么他们两个包下面会有都有aarch64-poky-linux-gcc:
hugo@hugo-virtual-machine:~/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux$ ls /home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g*
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc-ar
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc-nm
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc-ranlib
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcov
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcov-dump
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcov-tool
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gdb
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gdb-add-index
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gprof
hugo@hugo-virtual-machine:~/SDK/sysroots/aarch64-poky-linux/usr/bin$ ls /home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-g*
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-g++
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-gcc
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-gcc-ar
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-gcc-nm
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-gcc-ranlib
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-gprof
分析
对SDK的结构和各个目录的作用感到困惑,特别是sysroots下的aarch64-poky-linux和x86_64-pokysdk-linux这两个目录。还不明白为什么这两个目录下都有aarch64-poky-linux-gcc这样的工具链,以及aarch64和x86_64的区别,还有pokysdk的含义。
首先,我需要回忆一下嵌入式开发中SDK的常见结构。通常,SDK会包含交叉编译工具链、目标系统的头文件和库、以及一些配置脚本。SDK包里面的的environment-setup-aarch64-poky-linux应该是用来设置环境变量的脚本,比如PATH和交叉编译器的路径。site-config可能包含一些构建配置,version文件记录SDK的版本。
sysroots目录下通常会有两个部分:目标系统的根文件系统(target sysroot)和主机工具链的根文件系统(host sysroot)。aarch64-poky-linux可能是目标平台的sysroot,包含目标系统的头文件和库,而x86_64-pokysdk-linux是主机上的工具链,包含交叉编译器和其他构建工具。这里可能混淆的是,为什么在x86_64的目录下会有aarch64的工具链,这可能是因为交叉编译器本身是运行在x86主机上,但生成的是aarch64架构的代码。
接下来提到的aarch64和x86_64的区别?
aarch64是ARM的64位架构,而x86_64是Intel/AMD的64位架构。poky是Yocto项目使用的元数据集合,用来构建嵌入式Linux系统。pokysdk可能是指Yocto SDK的特定配置。
列出的目录中的工具链文件,比如aarch64-poky-linux-gcc,这些是交叉编译器,运行在x86主机上,但生成ARM架构的可执行文件。在目标sysroot中,可能有一些符号链接或工具链的副本,用于构建时引用目标系统的库。
解释每个目录的作用?
为什么会有两个sysroot,以及工具链的架构区别。用简单的比喻,比如交叉编译器就像翻译,把源代码从主机语言翻译成目标设备的语言。主机工具链是运行在开发机上的工具,而目标sysroot是目标设备需要的库和头文件。
还要注意用户可能混淆了主机架构和目标架构,需要明确区分。poky是Yocto的一部分,用于构建整个系统,所以SDK中的结构是为了支持交叉编译和系统构建。
总结来说,用户需要明白SDK的结构如何支持交叉编译,各个目录的作用,以及工具链的架构区别。需要避免技术术语过多,用日常例子帮助理解。
二、SDK 目录结构解析
1. 整体结构
SDK
├── environment-setup-aarch64-poky-linux # 环境变量配置文件
├── site-config-aarch64-poky-linux # 构建系统配置
├── sysroots # 目标系统和主机工具链的根目录
│ ├── aarch64-poky-linux # 目标系统的根目录(ARM架构)
│ ├── aarch64-poky-linux.tar.gz # 目标系统的压缩包
│ └── x86_64-pokysdk-linux # 主机工具链的根目录(x86架构)
└── version-aarch64-poky-linux # SDK版本信息
三、关键目录与文件的作用
1. environment-setup-aarch64-poky-linux
- 用途:配置交叉编译环境变量。
- 核心功能:
- 设置交叉编译器路径(
aarch64-poky-linux-gcc
)。 - 定义目标系统的根目录(
SDKTARGETSYSROOT
)。 - 配置编译选项(如
CFLAGS
、LDFLAGS
)。
- 设置交叉编译器路径(
- 为什么需要它:
告诉系统如何找到交叉编译器和目标系统的库/头文件,确保代码能正确编译为ARM架构的程序。
2. sysroots
目录
(1) aarch64-poky-linux
- 用途:目标系统的根目录(Target Sysroot)。
- 包含内容:
/usr/include
:目标系统的头文件(如stdio.h
、string.h
)。/usr/lib
:目标系统的库文件(如libc.so
)。/usr/bin
:目标系统的工具链符号链接(如aarch64-poky-linux-gcc
)。
- 为什么需要它:
编译程序时,交叉编译器需要从这里获取目标系统的头文件和库文件。
(2) x86_64-pokysdk-linux
- 用途:主机工具链的根目录(Host Sysroot)。
- 包含内容:
/usr/bin
:交叉编译器和其他工具(如aarch64-poky-linux-gcc
)。/usr/lib
:主机工具链的依赖库。
- 为什么需要它:
这些工具链运行在x86主机上(如你的虚拟机),但生成的是ARM架构的程序。
四、关键概念解释
1. aarch64
vs x86_64
aarch64:
- 定义:ARM 64位架构,用于嵌入式设备(如你的NXP i.MX 8M Mini)。
- 类比:相当于手机的“大脑”,负责执行代码。
x86_64:
- 定义:Intel/AMD的64位架构,用于PC或虚拟机。
- 类比:相当于你的电脑的“大脑”,用来编译代码。
2. poky
和 pokysdk
poky:
- 定义:Yocto项目的核心工具集,用于构建嵌入式Linux系统。
- 作用:帮你生成操作系统镜像、工具链和软件包。
pokysdk:
- 定义:基于Yocto生成的SDK(Software Development Kit)。
- 作用:提供开发所需的一切工具(编译器、库、头文件)。
3. 为什么两个目录下都有 aarch64-poky-linux-gcc
?
在
x86_64-pokysdk-linux
中的aarch64-poky-linux-gcc
:- 本质:运行在x86主机上的交叉编译器,用于生成ARM架构的程序。
- 路径示例:
/home/hugo/SDK/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc
在
aarch64-poky-linux
中的aarch64-poky-linux-gcc
:- 本质:符号链接或占位文件,仅为兼容性存在。
- 路径示例:
/home/hugo/SDK/sysroots/aarch64-poky-linux/usr/bin/aarch64-poky-linux-gcc
- 为什么需要它:某些构建工具(如
make
)可能需要在目标系统路径下查找工具链。
五、通俗易懂的比喻
交叉编译器:
- 你是一个英语老师(x86主机),要教一个只会中文的学生(ARM设备)学英语。
- 交叉编译器就是你的“翻译工具”,把英语教材(源代码)翻译成中文(ARM指令)。
sysroots 目录:
x86_64-pokysdk-linux
:你的书房,里面有翻译工具(编译器)、参考书(主机库)。aarch64-poky-linux
:学生的书包,里面有中文课本(目标系统头文件/库)。
六、总结
- SDK的作用:提供一套完整的工具,让你在x86电脑上开发ARM设备的软件。
- 关键目录分工:
x86_64-pokysdk-linux
:存放工具链(编译器、链接器)。aarch64-poky-linux
:存放目标系统的资源(头文件、库)。
- 为什么需要两个架构:
- x86_64:工具链需要运行在你的电脑上。
- aarch64:编译出的程序需要运行在ARM设备上。