0

我试图只使用 yocto 构建 gcc。我尝试使用“bitbake-layers show-recipes”,它显示了 gcc 的多个配方,bitbake -s 也是如此。

#bitbake-layers show-recipes 
gcc:
  meta                 4.8.2
gcc-cross:
  meta                 4.8.2
gcc-cross-canadian-arm:
  meta                 4.8.2
gcc-cross-initial:
  meta                 4.8.2
gcc-crosssdk:
  meta                 4.8.2
gcc-crosssdk-initial:
  meta                 4.8.2
gcc-runtime:
  meta                 4.8.2
gccmakedep:
  meta                 1:1.0.2

#bitbake -s 
gcc                                                 :4.8.2-r0                          
gcc-cross                                           :4.8.2-r0                          
gcc-cross-canadian-arm                              :4.8.2-r0                          
gcc-cross-initial                                   :4.8.2-r0                          
gcc-crosssdk                                        :4.8.2-r0                          
gcc-crosssdk-initial                                :4.8.2-r0                          
gcc-runtime                                         :4.8.2-r0                          
gccmakedep                                         1:1.0.2-r3

请指导我了解为什么有多个与 gcc 相关的配方以及我必须构建哪一个。

在 yocto 中,配方和包装是否存在一对一匹配。即对于创建每个包有一个对应的只有一个配方?

4

2 回答 2

6

依次解释每一项:

  • gcc 是在目标机器上运行的 gcc 的配方。
  • gcc-cross 是构建系统使用的交叉编译器。如果您为需要使用 gcc 编译的目标构建任何配方,这将用于编译它。
  • gcc-cross-canadian- 是 SDK 的最终可重定位交叉编译器,在本例中是针对 ARM 架构的。
  • gcc-crosssdk 是生成 gcc-cross-canadian 的中间步骤。
  • *-initial 是为标准交叉编译器和 SDK 分别引导工具链所需的编译器的初始版本。
  • gcc-runtime 构建作为 gcc 一部分的运行时组件(例如 libstdc++)。
  • gccmakedep 并不是 gcc 本身的一部分,它是一个脚本,作为 X11 实用程序的一部分,一些项目需要确定每个源文件的依赖关系。

当你说“你只需要构建 gcc”时,你的意思并不完全清楚,但我怀疑它要么是目标的 gcc(在这种情况下它是“gcc”,但我怀疑你可能需要更多 - packagegroup-core-buildessential 可能是您想要的)或者您想要一个可以单独安装的交叉编译器,在这种情况下您可能应该bitbake meta-toolchainbitbake -c populate_sdk imagename. 这将不仅仅包含 gcc,但很可能单独的 gcc 无论如何是不够的。

于 2016-06-01T02:05:50.610 回答
0

GCC 是一个巨大的项目。也许这个秘籍可以帮助你更好地理解 GCC 和 Yocto。以下信息是来自 Alex Gonzalez 的“Embedded Linux Projects Using Yocto Project Cookbook”的一些信息解释

GNU 工具链包含以下组件:

汇编程序(GNU as):binutils 包的一部分

链接器(GNU Id):binutils 包的一部分

编译器 (GNU gcc):支持 C、C++、Java、Ada、Fortran 和 Objective C

调试器 (GNU gdb):GNU 调试器

二进制文件工具(objdump、nm、objcopy、readelf、strip 等):这些是 binutils 包的一部分

这些组件足以构建裸机应用程序引导加载程序,例如 u-boot、Linux Kernel,因为它们不需要 C 库并且它们实现了所需的 C 库功能。LInux 用户空间应用程序需要符合 POSIX 标准的 C 库。

glibc 是 Yocto 项目中使用的默认 C 库。

在嵌入式系统上,我们需要一个交叉编译工具链。我们在主机中构建,但在通常是不同架构的目标上运行结果二进制文件。基于构建机器、目标机器的工具链有几种类型。

最常见的组合是:

本机:这方面的一个示例是运行工具链的 x86 机器,该工具链 > 也已构建在 x86 机器上,生成在 x86 机器上运行的二进制文件。这在台式计算机中很常见。

交叉编译:这是嵌入式系统上最常见的;例如,运行工具链的 x86 机器也已在 x86 机器上构建,但生成的二进制文件可在不同的架构(如 ARM)上运行。

跨原生:这通常是在目标上运行的工具链。这方面的一个例子是在 x86 机器上构建了一个工具链,但在 ARM 上运行并生成

加拿大人:很少见,这是构建、主机和目标机器都不同的地方。

于 2016-06-01T01:09:07.780 回答