Gcc 交叉编译术语——构建、宿主和目标

Gcc 交叉编译术语——构建、宿主和目标,gcc,cross-compiling,Gcc,Cross Compiling,我看到了很多冲突信息,希望得到一些澄清。 构建、宿主和目标 构建知道三个系统名称:构建的机器(build)、构建的机器(host)和GCC将为其生成代码的机器(target)。在配置GCC时,可以使用--build=、--host=、和--target=来指定它们 实际上,我不明白在上面的定义中主机和目标之间有什么区别 另一页说 “主机”是用于编译代码的机器(或体系结构或平台); “目标”是用于运行代码的机器(或体系结构或平台) 这对我来说是有道理的,但在这个解释中,主机是否总是与构建相同??我

我看到了很多冲突信息,希望得到一些澄清。 构建、宿主和目标

构建知道三个系统名称:构建的机器(build)、构建的机器(host)和GCC将为其生成代码的机器(target)。在配置GCC时,可以使用--build=、--host=、和--target=来指定它们

实际上,我不明白在上面的定义中主机和目标之间有什么区别

另一页说

“主机”是用于编译代码的机器(或体系结构或平台); “目标”是用于运行代码的机器(或体系结构或平台)

这对我来说是有道理的,但在这个解释中,主机是否总是与构建相同??我很困惑

在我的情况下,我正在配置 编译器(GCC)在x86_64机器上运行,二进制可执行文件在ARM上运行。程序是用C编写的,因此编译器是GCC

   ./configure --build=x86_64 --host=x86_64 --target=arm-linux-gnueabihf
    make
    make install
听起来像 构建时,主机都是x86_64,目标是arm。对吗


我正在编译自己的嵌入式程序,该程序运行在Jenkins机器(x86_64)上。嵌入式程序在基于ARM的机器上运行。

假设我有一台PowerPC机器,它制作了一个编译器,您将在x86机器上使用(运行)它来生成在ARM上运行的二进制文件

这使得PPC成为构建,x86成为主机,而目标是ARM。正如巴兹尔所评论的,这是一个加拿大十字架


构建和主机不同的情况不太常见,但确实会发生。有时构建和主机甚至是相同的体系结构,但导致这种情况的环境有所不同。在我的x86上创建自定义工具链意味着构建和主机是x86,但主机可能与构建具有不同的库或依赖项版本。例如,为在构建服务器上运行的嵌入式开发构建沙盒工具链时就是这种情况。

让我们假设我有一台PowerPC机器制作了一个编译器,您将在x86机器上使用(运行)它来生成在ARM上运行的二进制文件

这使得PPC成为构建,x86成为主机,而目标是ARM。正如巴兹尔所评论的,这是一个加拿大十字架

构建和主机不同的情况不太常见,但确实会发生。有时构建和主机甚至是相同的体系结构,但导致这种情况的环境有所不同。在我的x86上创建自定义工具链意味着构建和主机是x86,但主机可能与构建具有不同的库或依赖项版本。例如,为在构建服务器上运行的嵌入式开发构建沙盒工具链时就是这种情况

“构建知道三个系统名称:您正在构建的机器(
build
)、您正在构建的机器(
host
),以及GCC将为其生成代码的机器(
target
)。配置GCC时,可以使用
--build=
--host=
--target=
指定这些

  • 如果
    构建
    主机
    目标
    都相同,则称为本机
  • 如果
    构建
    主机
    相同,但
    目标
    不同,则称为交叉
  • 如果
    build
    host
    target
    都不同,则称之为加拿大人(因为当时涉及加拿大政党和构建人员背景的模糊原因)
  • 如果
    主机
    目标
    相同,但
    构建
    不同,则使用交叉编译器为不同的系统构建本机。
    • 有些人将其称为host-x-host、交叉本机或交叉构建本机
  • 如果
    build
    target
    相同,但
    host
    不同,则使用交叉编译器来构建交叉编译器,为正在构建的机器生成代码。
    • 这是罕见的,因此没有通用的描述方式。有人提议称之为交叉攻击
资料来源:

有人已经举了一个“加拿大人”的例子

交叉编译的一个例子是,当从源代码(Linux声音库)构建
sox
时,您需要为编解码器等提供32位二进制文件。我刚刚在64位机器上遇到这种情况,我想构建它以供自己使用,这意味着在本例中:

  • 构建
    主机
    (我的机器)
  • 目标
    是一个32位系统
这是我的理解,我同意这可能有点令人困惑,希望这有帮助:-)

“构建知道三个系统名称:您正在构建的机器(
build
)、您正在构建的机器(
host
),以及GCC将为其生成代码的机器(
target
)。配置GCC时,可以使用
--build=
--host=
--target=
指定这些

  • 如果
    构建
    主机
    目标
    都相同,则称为本机
  • 如果
    构建
    主机
    相同,但
    目标
    不同,则称为交叉
  • 如果
    build
    host
    target
    都不同,则称之为加拿大人(因为当时涉及加拿大政党和构建人员背景的模糊原因)
  • 如果
    主机
    目标
    相同,但
    构建
    不同,则使用