脚本./configure
接受三个选项--build
,--host
和--target
。我对它们的角色感到困惑。它们之间有什么不同和语义差异?
脚本./configure
接受三个选项--build
,--host
和--target
。我对它们的角色感到困惑。它们之间有什么不同和语义差异?
如同在这篇博客文章中所指出的并在GCC配置术语中提到的那样,--target
只有在编译工具链时才会应用。当您进行普通库或二进制文件的交叉编译时,您需要使用
--build=the architecture of the build machine
--host=the architecture that you want the file to run on
然而,当你正在构建工具链时,事情可能会变得更加复杂。我认为以下内容是正确的(尽管我不能说我曾手动编译过交叉调试器):
假设你有:
你需要配置和构建调试服务器(例如 gdbserver),以在嵌入式设备上运行。
./configure --build=powerpc --host=mips
这样您就可以连接到嵌入式设备并运行"gdbserver :1234 a.out"启动调试,并侦听1234端口。
然后,您需要使用以下方式构建调试客户端(用于连接和控制gdbserver):
./configure --build=powerpc --host=i686 --target=mips
你需要将以下代码复制到你的x86笔记本电脑上,以便在现场运行"gdbclient embedded.device:1234"来调试你的a.out程序。
这对于编译器也适用,你可能需要查看上面提到的GCC链接或者关于加拿大交叉编译的这个部分。
此外,要注意的是,在实际应用中,你可能不会看到build、host或target被指定,因为根据这个Autoconf手册页面,“目标默认为主机,主机为构建,而构建则为config.guess的结果。”
总之,在--build
上构建代码,在一个--host
环境中运行它,具有--target
体系结构。
注意: 仅在构建编译器(例如GCC)时,参数--target
才有意义。 在构建GCC之前运行configure
时:
--build
: 安装GCC的主机--host
: GCC将要运行在哪台主机上--target
: 构建出的二进制文件将在哪台主机上运行来自GCC文档 (特定主机/目标安装说明):
如果构建、主机和目标都相同,则称为本机(native)。如果构建和主机相同,但目标不同,则称为交叉(cross)。如果构建、主机和目标都不同,则称为加拿大式(canadian)(由于加拿大政党和当时从事构建工作的人的背景原因而产生的玩笑)。如果主机和目标相同,但构建不同,则使用交叉编译器为不同系统构建本机。有些人称之为主机-x-主机(host-x-host)、交叉本机(crossed native)或交叉构建本机(cross-built native)。如果构建和目标相同,但主机不同,则使用交叉编译器构建可在正在构建的计算机上运行的交叉编译器。这种情况很少见,因此没有通用的描述方式。有一个提议称其为crossback。
--target
选项只适用于编译器本身而非其他项目。那么为什么它还是一个标准配置选项呢?令人困惑。 - dhardyconfigure
并不是一个良好且清晰设计的顶峰;我猜这只是应用特定功能蔓延的结果。 - Tim Čas
--host
和--build
参数。我有两个C++项目,由于Autotools的问题,无法为Android构建这些项目。它坚持使用主机的工具链来运行测试。 - jww