【Linux】交叉编译2

ops/2025/3/23 10:00:15/

一、文章背景

疑惑

官方提供的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版本信息

三、关键目录与文件的作用

linux_78">1. environment-setup-aarch64-poky-linux
  • 用途:配置交叉编译环境变量。
  • 核心功能
    • 设置交叉编译器路径(aarch64-poky-linux-gcc)。
    • 定义目标系统的根目录(SDKTARGETSYSROOT)。
    • 配置编译选项(如 CFLAGSLDFLAGS)。
  • 为什么需要它
    告诉系统如何找到交叉编译器和目标系统的库/头文件,确保代码能正确编译为ARM架构的程序。

2. sysroots 目录
linux_90">(1) aarch64-poky-linux
  • 用途目标系统的根目录(Target Sysroot)。
  • 包含内容
    • /usr/include:目标系统的头文件(如 stdio.hstring.h)。
    • /usr/lib:目标系统的库文件(如 libc.so)。
    • /usr/bin:目标系统的工具链符号链接(如 aarch64-poky-linux-gcc)。
  • 为什么需要它
    编译程序时,交叉编译器需要从这里获取目标系统的头文件和库文件。
linux_99">(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)。
    • 作用:提供开发所需的一切工具(编译器、库、头文件)。

linuxgcc_130">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设备上。

http://www.ppmy.cn/ops/167748.html

相关文章

如何通过Python实现自动化任务:从入门到实践

在当今快节奏的数字化时代,自动化技术正逐渐成为提高工作效率的利器。无论是处理重复性任务,还是管理复杂的工作流程,自动化都能为我们节省大量时间和精力。本文将以Python为例,带你从零开始学习如何实现自动化任务,并通过一个实际案例展示其强大功能。 一、为什么选择Pyt…

设计模式,如单例模式、观察者模式在什么场景下使用

以下是单例模式和观察者模式的介绍及应用场景: 单例模式 - 定义:保证一个类仅有一个实例,并提供一个全局访问点。 - 实现方式:私有化构造函数,防止外部实例化;提供一个静态成员函数来获取唯一实例。 - 应用…

STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构

目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层(Perception Layer) 2. 网络层(Network Layer) …

针对耳鸣患者推荐的一些菜谱和食材

耳鸣患者应当关注饮食的均衡性,因为许多食物和营养素都可能对改善听力问题产生积极影响。以下是针对耳鸣患者推荐的一些菜谱和食材,以供参考。 一、蔬菜类 1. 菠菜:菠菜富含铁元素,对于补血益气有良好效果,能改善因贫…

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…

Spring Boot Actuator 自定义健康检查(附Demo)

目录 前言1. Demo2. 拓展 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF Spring Boot 的 actuator 提供了应用监控的功能,其中健康检查(Health Check)是一个重要的部分&…

游戏引擎学习第169天

回顾和今天的计划 接下来进行编译,并设置编译目录,以便查看昨天的工作成果。可以看到,我们的界面上已经有了一些字体显示的内容。现在,可能是一个合适的时机关闭背景音乐,目前不需要音乐,相信大多数人也不…

基于java的ssm+JSP+MYSQL的母婴用品网站(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能模块: 主页 个人中心 用户管理 商品分类管理 商品信息管理 留言板管理 成长交流 系统管理 订单管理 留言管理 用户功能模块: 主页 个人中心 我的收藏管理 订单管理 前台首页功能模块: 首页 商品信息 论…