【问题标题】:Building only gcc using yocto仅使用 yocto 构建 gcc
【发布时间】:2016-06-01 11:19:53
【问题描述】:

我试图只使用 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 中,recipe 和 package 是否存在一对一的匹配。即对于创建每个包,只有一个对应的配方?

【问题讨论】:

    标签: yocto gcc4.8


    【解决方案1】:

    依次解释:

    • 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 是不够的。

    【讨论】:

    • 我需要为 IMX6 编译第 3 方源代码,我需要 IMX6 工具链来交叉编译。由于完整构建(bitbake core-minimal-image)需要更多时间,并且在使用 fetchers 下载所需包时它会失败,因为如果包大小很大,则 fetch url 在办公网络中被阻止。所以我认为只使用 yocto 构建工具链将花费更少的时间并且下载失败也最少。
    • 如果您无法在某处找到预构建的 IMX6 SDK/工具链安装程序,我会感到非常惊讶。如果做不到这一点,请使用 bitbake -c fetchall 在公司网络之外进行下载,然后通过sn​​eakernet 将其导入以完成。
    • 我还通过修改一些 inc 文件来更改工具链配置以禁用硬浮点。每次当我修改一个变量时,我也在清理和构建图像。大部分时间我都在等待构建完成。我检查了如何使用 yocto 仅构建所需的包,但是当我使用 bitbake -s 检查包列表时,我看到了 gcc 的多个包。
    【解决方案2】:

    GCC 是一个庞大的项目。也许这个recipe 可以帮助你更好地理解 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 库。

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

    最常见的组合是:

    Native:这方面的一个示例是运行工具链的 x86 机器,该工具链 > 也已构建在 x86 机器上 生成在 x86 机器上运行的二进制文件。这在桌面很常见 电脑。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2020-01-23
      • 2017-06-02
      • 2021-10-14
      • 1970-01-01
      • 2018-05-13
      • 2020-07-28
      相关资源
      最近更新 更多