当涉及到创建交叉开发工具链时,Yocto Project 将完成大部分工作。在Yocto项目开发环境中,交叉开发工具链用于构建在目标硬件上运行的镜像和应用程序。只需几个命令,OpenEmbedded构建系统就可以创建这些必要的工具链。

下图显示了关于工具链构造和使用的高级构建环境。

Yocto理论篇 | Yocto交叉开发工具链生成_Yocto

大部分工作发生在Build Host上。这是用于构建镜像的机器,通常在Yocto Project 环境中工作。运行BitBake 创建镜像时,OpenEmbedded构建系统使用主机​gcc​ 编译器引导名为​gcc-cross​的交叉编译器。​gcc-cross​编译器是BitBake在创建目标镜像时用来编译源文件的。可以将​gcc-cross​简单地看作是一个自动生成的交叉编译器,只在BitBake内部使用。

注意:Extensible SDK不使用gcc-cross-canadian,因为此SDK提供了OpenEmbedded构建系统的副本,其中的sysroot包含​gcc-cross​

启动gcc-cross时发生的事件链如下:

gcc -> binutils-cross -> gcc-cross-initial -> linux-libc-headers -> glibc-initial -> glibc -> gcc-cross -> gcc-runtime
  • gcc:构建主机的GNU Compiler Collection(GCC)。
  • binutils-cross:运行引导操作的​gcc-cross-initial​所需的最小二进制工具。
  • gcc-cross-initial:创建交叉编译器的引导过程的早期阶段。这个阶段构建了足够的​gcc-cross​、C库和其他部分,以便在以后的阶段中完成最终的交叉编译器的构建。此工具是一个“native”包(即它被设计为在构建主机上运行)。
  • linux-libc-headers:交叉编译器需要的头文件。
  • glibc-initial:引导​glibc​所需的Embedded GNU C Library(GLIBC)的初始版本。
  • glibc:  GNU C Library。
  • gcc-cross:交叉编译器引导过程的最后一个阶段。此阶段将生成BitBake在为目标设备构建镜像时使用的实际交叉编译器。
  • gcc: The build host's GNU Compiler Collection (GCC).

注意:如果要用自定义版本替换此交叉编译器工具链,则必须替换gcc-cross。此工具也是一个“native”包(即它被设计为在构建主机上运行)。

  • gcc-runtime:工具链引导过程产生的运行库。此工具生成一个二进制文件,其中包含目标设备所需的运行库。

可以使用OpenEmbedded构建系统来为用于开发应用程序的可重定位SDK构建安装程序。当您运行安装程序时,它会安装包含开发工具(例如gcc-cross-canadia、​​binutils-cross-canadian和其他​nativesdk-*​工具)的工具链,这些工具是SDK的原生工具(即​SDK_ARCH​的原生工具),需要交叉编译和测试软件。此图显示了用于轻松构建此工具链的命令。这个交叉开发工具链是为了在​SDKMACHINE​上执行而构建的,可能与构建主机可能是同一台机器,也可能不是同一台机器。

注意:如果您的目标体系结构受Yocto Project的支持,那么可以利用Yocto Project附带的、已经包含交叉开发工具链安装程序的预构建镜像。

以下是可重定位工具链的引导过程:

gcc -> binutils-crosssdk -> gcc-crosssdk-initial -> linux-libc-headers ->
glibc-initial -> nativesdk-glibc -> gcc-crosssdk -> gcc-cross-canadian
  • gcc:构建主机的GNU Compiler Collection(GCC)。
  • binutils-crosssdk:运行引导操作的​gcc-crosssdk-initial​所需的最小二进制工具。
  • gcc-crosssdk-initial:创建交叉编译器的引导过程的早期阶段。这个阶段构建了足够的​gcc-crosssdk​和支持部分,这样引导过程的最后一个阶段就可以生成完成的交叉编译器。此工具是在生成主机上运行的“native”二进制文件。
  • linux-libc-headers:交叉编译器需要的头文件。
  • glibc-initial:引导​nativesdk-glibc​所需的Embedded GLIBC的初始版本。
  • nativesdk-glibc:Embedded GLIBC需要引导​gcc-crosssdk​
  • gcc-crosssdk:可重定位交叉编译器引导过程的最后一个阶段。​gcc-crosssdk​是一个临时编译器,从不离开构建主机。它的目的是在引导过程中帮助创建最终的​gcc-cross-canadian​编译器,它是可重定位的。此工具也是一个“native”包(即它被设计为在构建主机上运行)。
  • gcc-cross-canadian:最终的可重定位交叉编译器。在​SDKMACHINE​上运行时,此工具生成在目标设备上运行的可执行代码。每个体系结构只生成一个cross-canadian编译器,因为它们可以针对不同的处理器优化,使用通过编译命令传递给编译器的配置。这避免了对多个编译器的需要,从而减少了工具链的大小。