使用交叉编译器时如何确定配置的主机值
Posted
技术标签:
【中文标题】使用交叉编译器时如何确定配置的主机值【英文标题】:How to determine host value for configure when using cross compiler 【发布时间】:2014-03-26 05:58:35 【问题描述】:一般问题:如果我使用交叉编译器,我如何知道我在运行 configure 时应该给出的“--host”选项的值?
具体:我正在为 arm64 架构使用交叉编译器。使用什么正确的“--host”值?
【问题讨论】:
虽然您要求host
值,但我认为您真的想要build
值。 host
是机器配置正在运行,你可以通过config.guess
得到它。你想要build
的三元组,这就是包最终运行的机器。 (不要使用--target
;它用于交叉编译工具链)。三胞胎是共享的,但没有简单的方法来获取三胞胎的列表。另请参阅 Autoconf 邮件列表中的 How To Configure for android?。
【参考方案1】:
如果我使用交叉编译器,我如何知道在运行
./configure
时应该给出的--host
选项的值?
讨论工具链创建时必须区分三台机器
构建机器,用于构建工具链。 主机,工具链将在其中执行。 目标机器,由 工具链被执行。工具链可能有四种常见的构建类型:
本机构建即BUILD==HOST==TARGET
用于为工作站构建正常的 gcc。例如BUILD==HOST==TARGET==x86
交叉构建即BUILD==HOST!=TARGET
用于构建在您的工作站上工作但为目标生成二进制文件的工具链。例如BUILD==HOST==x86 TARGET==arm
跨原生构建即BUILD!=HOST==TARGET
用于在您的目标上工作并为目标生成二进制文件的工具链。例如BUILD==x86 HOST==TARGET==ARM
加拿大工具链即BUILD!=HOST!=TARGET
用于构建架构 A,工具链在 B 上运行并为架构 C 生成二进制文件。例如BUILD==x86 HOST==mac TARGET==arm
有了这个基础知识来回答你的问题。
对于任何软件,首先运行./configure --help
主机类型:
--build=BUILD configure for building on BUILD [BUILD=HOST]
--host=HOST configure for HOST [guessed]
--target=TARGET configure for TARGET [TARGET=HOST]
您会在上面找到,因此取决于您想要做什么,您需要将其设置为交叉编译。如果所有选项都可用,那么你想在 arm 目标上执行然后设置--host=your toolchain triplet --target=your toolchain triplet
。
例如,如果您使用arm-none-linux-gnueabi-gcc
,请设置--host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi
。这将写入您的makefile。
最后,生成的可执行文件将在目标上运行。 --build
会自动设置,不用担心。
对于某些软件包,只有两个选项可用i.e host and build
。这里如果设置host
就足够交叉编译了
具体:我正在为
arm64
arch 使用交叉编译器。要使用的正确--host
值是什么?
对于 x86_64,通常会给出 --host=triplet
,所以我认为通过为您的工具链设置 --host=triplet
,同样适用于 arm64,但我不确定。
【讨论】:
这是一块埋藏的宝石。感谢您写得很好的答案! 有人知道 arm64 的“--host”值应该是什么吗? @PixelPerfect3 应该是 aarch64-linux 很抱歉再次提及,但@PixelPerfect3 是对的 - 问题是如何确定配置的 --host 和 --target 选项的正确值。是否有任何工具可以调用,以获得正确的价值?或者任何配置文件来检查这些值?独立于平台和配置 - 关于如何收集这些值的通用方法。从工具链名称/前缀中提取“三元组”的一部分不是通用选项。更多的是猜测和希望。 在哪里可以找到汽车工具的标准架构列表?我尝试为 arm64 和 X86_64 构建,但当我将主机设置为 arm64 和 x86_64-apple-darwin 时,它们最终具有相同的架构。【参考方案2】:找出--host
中输入内容的最简单方法是在主机上运行config.guess
。在我的机器上它位于 /usr/share/automake-1.15/
,但我建议运行 locate config.guess
来找到它。
该脚本是开源的 (GPL),可在此地址获取,以防它在您的机器上不可用:
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
在我的目标机器上,一个 tegra X1(也是一个 aarch64)它给出的答案是 aarch64-unknown-linux-gnu,它似乎可以很好地用于交叉编译。
【讨论】:
这必须是正确/可接受的答案!谢谢@Drugbird! config.guess 至少正确传递了主机名。也很高兴有一个正确的方法来获取目标名称。某种列表,或硬件供应商引用的参考。很难相信没有类似的东西可用。【参考方案3】:--host 是您的构建最终将在其上运行的机器的“三元组”。在您的情况下,“arm64”是架构,但它只是三元组中的一个。无论如何,它映射到三元组中的字符串“aarch64”。一种可能的值是
--host=aarch64-linux-android
这个page from gnu.org 给出了关于--host/--target/--build 用法的明确答案
【讨论】:
以上是关于使用交叉编译器时如何确定配置的主机值的主要内容,如果未能解决你的问题,请参考以下文章