我试图仅使用 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 中,配方和包装是否存在一对一匹配。即,对于创建每个包,只有一个对应的配方?
依次解释每一项:
当你说“你只需要构建 gcc”时,并不完全清楚你的意思,但我怀疑它是目标的 gcc (在这种情况下它是“gcc”,尽管我怀疑你可能需要更多- packagegroup-core-buildessential 可能是您想要的)或者您想要一个可以单独安装的交叉编译器,在这种情况下您可能应该
bitbake meta-toolchain
或 bitbake -c populate_sdk imagename
。这将不仅仅包含 gcc,但单独的 gcc 可能还不够。
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 内核这样的引导加载程序,因为它们不需要 C 库并实现他们需要的 C 库函数。 LInux 用户空间应用程序需要符合 POSIX 的 C 库。
glibc 是 Yocto 项目中使用的默认 C 库。
在嵌入式系统上,我们需要一个交叉编译工具链。 我们建造 在主机上,但在目标上运行结果二进制文件 通常是不同的架构。 工具链有多种类型 基于构建机器、目标机器。
最常见的组合是:
Native:一个例子是运行工具链的 x86 机器,该工具链也是在 x86 机器上构建的 生成在 x86 机器上运行的二进制文件。这在桌面上很常见 电脑。
交叉编译:这是嵌入式上最常见的 系统;例如,运行工具链的 x86 机器也具有 在 x86 机器上构建,但生成在 x86 机器上运行的二进制文件 不同的架构,例如ARM。
跨原生:这通常是 在目标上运行的工具链。一个例子是工具链 已在 x86 机器上构建,但在 ARM 上运行并生成
加拿大语:很少见,这是构建、主机和目标的地方 机器都不同。