当我们已经有 CROSS_COMPILE= 时为啥还要有 ARCH=

Posted

技术标签:

【中文标题】当我们已经有 CROSS_COMPILE= 时为啥还要有 ARCH=【英文标题】:Why having the ARCH= when we already have CROSS_COMPILE=当我们已经有 CROSS_COMPILE= 时为什么还要有 ARCH= 【发布时间】:2022-01-16 12:43:09 【问题描述】:

这个问题对你们中的一些人来说可能听起来很明显,但对我来说,它似乎是我理解图片所需的缺失部分。

编辑:具体来说,我在我的 PC 上使用 Ubuntu VM,试图构建一个应该在 BeagleBone Black 上运行的 Out-of-Tree 内核模块,

在make命令中我通常需要输入以下2个参数:

    ARCH= CROSS_COMPILE= 对我来说,“1”看起来像是多余的信息,只会增加 make 命令的复杂性。

当然,同时使用它们是有充分理由的,我尝试在许多论坛和网站中进行搜索,但找不到“傻瓜答案” - 我想这就是我正在寻找的.

所以 - 我的问题:指定 CROSS_COMPILE= 不足以构建源代码吗?举个例子:

arm-linux-gnueabihf- aarch64-none-elf- arm-none-linux-gnueabihf

在上述所有选项中,我们都有目标 CPU 架构,即 armaarch64(也是 arm64)。

那么,如果架构已经包含在 CROSS_COMPILE= 指令中,为什么我们还需要一个特定的指令,例如 ARCH=?

【问题讨论】:

ARCH 通常用于选择必须构建的项目部分,这取决于目标架构。 CROSS_COMPILE 一般用于选择特定的交叉编译器。如果您使用名为 ccSuper7 的自定义交叉编译器,构建系统如何猜测您的目标架构是 ARM? 【参考方案1】:

CROSS_COMPILE 是不够的。虽然 ARCH 可能主要来源于它, 不能保证机械提取规则会起作用 正确地为其所有未来的价值。没有要求 CROSS_COMPILE 应该以 ARCH 开头,这只是一个约定。

从 Cross-compiling the kernel, 看到它们根本不一样:

CPU 架构和交叉编译器前缀是通过 顶层 Makefile 中的 ARCH 和 CROSS_COMPILE 变量。

ARCH 是架构的名称。 它由内核源代码中 arch/ 中的子目录的名称定义 示例:如果你武装 想为 arm 架构编译内核。 CROSS_COMPILE 是交叉编译工具的前缀 示例:arm-linux- 如果你的编译器是 arm-linux-gcc

【讨论】:

以上是关于当我们已经有 CROSS_COMPILE= 时为啥还要有 ARCH=的主要内容,如果未能解决你的问题,请参考以下文章

当我们有常规数组时,为啥我们需要指向数组的指针?

当我们已经拥有更强大的向量时,为啥还需要堆栈?

封装——当设置器已经公开时,为啥我们需要它? [复制]

当我们有客户端会话时,为啥我们需要 JWT?

为啥当我们有 const 引用时创建临时对象?

当我们有一个红色区域时,为啥我们需要堆栈分配?