【问题标题】:cross compilers交叉编译器
【发布时间】:2013-03-14 17:09:40
【问题描述】:

我了解什么是交叉编译器以及为什么要使用它们。但在一次采访中,有人问我交叉编译器与普通编译器在哪些方面不同。我告诉他们交叉编译器的目的。此外,它们的内存映射也会有所不同。但这家伙似乎并不相信。谁能告诉我与普通编译器的基本区别?

【问题讨论】:

  • 你认为目的是什么?
  • 有些面试官擅长保持面无表情,不管你的答案是什么。也许你确实说服了他,但他不想对你的回答做出强烈反应。
  • 对于这种情况的一个很好的提示是询问他们认为答案是什么。即使你没有得到这份工作,你也会学到一些新东西。在面试中被问及多线程时,我也遇到了类似的情况。多线程被过度使用,通常是不必要的。面试官问什么时候有用,我想不出一个很好的例子,问了他同样的问题。我没有得到这份工作,但我确实通过一个非常好的答案增加了我的编程知识。
  • 你是怎么回答这个问题的?不知道你说什么很难帮助你。
  • @EJP :我告诉他,为了在不同的架构上运行图像和可执行文件,而不是在我们编写代码的地方,我们使用交叉编译器。我也给他举了一个例子。向他解释了不同架构的字长和内存映射有何不同,因此我们需要交叉编译器。

标签: compiler-construction cross-compiling


【解决方案1】:

交叉编译器是能够创建可执行代码的编译器 运行编译器的平台以外的平台。叉 编译器工具用于为嵌入式系统生成可执行文件或 多个平台。它用于编译它所在的平台 进行编译是不可行的,例如不支持的微控制器 支持操作系统。使用这个变得越来越普遍 系统可能有一个或多个的半虚拟化工具 正在使用的平台。 - WIKI

根据某些来源,您不能只说 java(或任何其他使用运行时环境或虚拟机)作为交叉编译器。

真正的交叉编译器可以从一个源代码针对多个平台。但是您可能必须分别构建它们中的每一个

【讨论】:

    【解决方案2】:

    【讨论】:

    • 这就是交叉编译器的作用。它们在哪些方面与普通编译器不同?
    • 将 'cross' 替换为 'normal',然后在 '.... 中替换为运行编译器的平台。然后创建一个描述这种差异的句子。
    • 嗯,许多在技术上不是交叉编译器的编译器也可以做到这一点,这取决于你的听众如何解释“平台”这个词。我更倾向于否定地定义它:使用交叉编译器构建的可执行文件不能在其编译的平台上本地运行。
    【解决方案3】:

    普通编译器可以是交叉编译器。以GCC 为例。

    引用Wikipedia:

    GCC,一个免费的软件集合 编译器,可以设置为交叉 编译。它支持许多平台 和语言。但是,由于有限 志愿者时间和大量的 维持工作所需的工作 交叉编译器,在许多版本中,一些 交叉编译器是 坏了。[需要引用]

    GCC 要求编译后的副本 binutils 可用于每个 有针对性的平台。尤其 重要的是 GNU 汇编器。 因此,binutils 首先必须是 使用开关正确编译 --target=some-target 发送到配置脚本。 GCC 也必须是 配置了相同的 --target 选项。然后GCC就可以正常运行了 提供的工具,其中 binutils 创建,可在 路径。

    【讨论】:

    • 但这并不能说明交叉编译器与编译器有何不同
    • @ravspratapsingh:如果我错了,请有人纠正我,但我认为你不能拥有一个也不是编译器的交叉编译器。交叉编译器是一种能够为与调用编译的主机平台不同的目标平台生成代码的编译器。如果这样的答案不能让面试官满意,那我想知道他的答案会是什么。
    • 我想他想知道编译器代码到底有什么不同。
    • 我怀疑:你整个星期都在那儿。
    【解决方案4】:

    主要区别在于,使用“普通编译器”,您可以直接在编译它的机器上运行编译后的可执行文件。使用交叉编译器,您必须以某种方式使用其目标平台将其上传到系统以运行它并查看它是否有效。 (或者使用某种模拟器或虚拟机)。

    这是唯一的大区别,真的。它在您的编辑-编译-调试周期中增加了一两个额外的步骤。这可能有点痛苦。再说一次,交叉编译器通常用于实时或嵌入式系统,其中一个错误可能导致整个系统崩溃。如果发生这种情况,在您的开发系统上运行将是更多的痛苦,因为您将不断地等待重新启动并重新启动您的编辑器,将工作文件重新加载到您的编辑器中,等等.

    【讨论】:

      【解决方案5】:

      一些交叉编译器具有可插入的代码生成器,因此您只需指明要生成的代码类型,它们就会查找适当的生成器并为您指定的目标调用适当的汇编器。但是,在大多数情况下,编译器就是编译器。他们都做同样的事情。

      【讨论】:

        【解决方案6】:

        我认为交叉编译器使用不同的汇编语言代码。 例如,i386 和 arm 使用不同的汇编语言代码。

        【讨论】:

          猜你喜欢
          • 2011-09-03
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-05
          相关资源
          最近更新 更多