【Linux】交叉编译2

发布于:2025-03-22 ⋅ 阅读:(25) ⋅ 点赞:(0)

一、文章背景

疑惑

官方提供的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)。
    • 配置编译选项(如 CFLAGSLDFLAGS)。
  • 为什么需要它
    告诉系统如何找到交叉编译器和目标系统的库/头文件,确保代码能正确编译为ARM架构的程序。

2. sysroots 目录
(1) aarch64-poky-linux
  • 用途目标系统的根目录(Target Sysroot)。
  • 包含内容
    • /usr/include:目标系统的头文件(如 stdio.hstring.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. pokypokysdk
  • 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)可能需要在目标系统路径下查找工具链。

五、通俗易懂的比喻

  1. 交叉编译器

    • 你是一个英语老师(x86主机),要教一个只会中文的学生(ARM设备)学英语。
    • 交叉编译器就是你的“翻译工具”,把英语教材(源代码)翻译成中文(ARM指令)。
  2. sysroots 目录

    • x86_64-pokysdk-linux:你的书房,里面有翻译工具(编译器)、参考书(主机库)。
    • aarch64-poky-linux:学生的书包,里面有中文课本(目标系统头文件/库)。

六、总结

  • SDK的作用:提供一套完整的工具,让你在x86电脑上开发ARM设备的软件。
  • 关键目录分工
    • x86_64-pokysdk-linux:存放工具链(编译器、链接器)。
    • aarch64-poky-linux:存放目标系统的资源(头文件、库)。
  • 为什么需要两个架构
    • x86_64:工具链需要运行在你的电脑上。
    • aarch64:编译出的程序需要运行在ARM设备上。