当前位置: 首页 > article >正文

【Linux】交叉编译2

一、文章背景

疑惑

官方提供的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设备上。

http://www.kler.cn/a/598813.html

相关文章:

  • 第二课,从bp(Burp suite)抓包开始
  • 数据库:一文掌握 Neo4J 的各种指令(Neo4J指令备忘)
  • 创建WebSocket服务器:TouchSocket框架实践
  • 手动配置树莓派wifi联网连接热点手机热点
  • Spring的传播行为
  • QT5.14.2 gradle 构建安卓失败的处理方法
  • Unity3D 基于物理的动画(Physics-based Animation)
  • 新能源汽车充换站如何实现光储充一体化管理?
  • 2269. 找到一个数字的 K 美丽值
  • 10分钟读完《有限与无限的游戏》
  • 【Java面试系列】初识GateWay网关
  • 【Linux系统】Linux权限讲解!!!超详细!!!
  • 蓝桥杯 之 第27场月赛总结
  • QT笔记---JSON
  • Uthana,AI 3D角色动画生成平台
  • Java 集合框架:从数据结构到性能优化,全面解析集合类
  • 深度学习Python编程:从入门到工程实践
  • c++图论(六)之字典序最小欧拉路
  • TDengine又新增一可视化工具 Perspective
  • 【模拟面试】计算机考研复试集训(第十三天)