如何确定使用交叉编译器时配置主机值

22

通用问题: 如果我使用交叉编译器,我如何确定运行configure时应给予的"--host"选项的值?

具体问题:我正在使用面向arm64架构的交叉编译器。应该使用什么正确的"--host"值?


虽然您请求了host的值,但我认为您 实际上 想要的是build的值。host是配置正在运行的机器,并且可以使用config.guess获取。您需要的是build的三元组,这是软件包最终将在其中运行的计算机。(不要使用--target;那是用于交叉编译工具链的)。三元组对于两个都是共享的,但没有简单的方法来获取三元组列表。还可以查看Autoconf邮件列表中的How To Configure for Android? - jww
3个回答

51
如果我使用跨编译器,如何确定运行./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来说,这将自动设置,不需要担心。

对于某些软件包,只有两个选项可用,即hostbuild。在这种情况下,如果设置了host,则足以进行交叉编译。

具体来说:我正在使用交叉编译器进行arm64架构。正确的--host值是什么?

对于x86_64架构,通常会给出--host={triplet},因此我认为设置 --host={triplet} 适用于您的工具链,但我不确定。


1
这是一个被埋藏的宝石。感谢您写得好的答案! - hesham_EE
2
有人弄清楚了arm64的“--host”值应该是什么吗? - PixelPerfect3
@PixelPerfect3 应该是 aarch64-linux。 - Zain Ali
2
很抱歉再次提出这个问题,但@PixelPerfect3是正确的 - 问题是如何找到configure的--host和--target选项的正确值。 有没有任何工具可以调用以获取正确的值? 或者检查这些值的任何配置文件? 独立于平台和配置 - 如何收集这些值的通用方法。 从工具链名称/前缀中提取“三元组”的部分不是通用选项。 这更像是猜测和希望。 - OpalApps
在哪里可以找到自动工具的标准架构列表?我尝试为arm64和X86_64构建,但当我将主机设置为arm64和x86_64-apple-darwin时,它们最终具有相同的架构。 - kakyo
很常见的是,只要设置了--host开关并使用正确的交叉工具链,autoconf项目就可以正确地进行交叉编译,而不需要--target开关。如果只有--host存在,那么假设目标与--host相同,这种做法是否正确? - ceztko

16

找出在--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,对于交叉编译似乎可以正常工作。


2
这必须是一个正确/被接受的答案!感谢@Drugbird!config.guess至少能正确提供主机名。也很希望有一种正确的方法来获取目标名称。一种某种列表,或者参考硬件供应商所指的内容。很难相信没有类似的东西可用。 - OpalApps

6

--host是最终构建运行的机器的“三元组”。在你的情况下,“arm64”是架构之一,但只是三元组的一部分。无论如何,它映射到三元组中的字符串“aarch64”。一个可能的值是

--host=aarch64-linux-android

这个gnu.org页面给出了关于--host/--target/--build用法的明确答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接