“ ./configure”选项“ --build”,“-host”和“ --target”有什么区别?


121

该脚本./configure接受3个选项--build--host--target。我混淆了他们的角色。它们的区别和语义是什么?


即使使用--host和,Autotools也会使用错误的工具链进行交叉编译--build。我有两个C ++项目,由于Autotools非常流行,因此无法为Android构建。它坚持使用主机的工具链运行测试。
jww

Answers:


109

本博文所述,在GCC配置条款中已提及,--target仅在编译工具链时适用。在对库或二进制文件进行常规交叉编译时,请使用

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

然而,当你正在构建工具链,事情变得更加复杂。我认为以下是正确的(尽管我不能说我曾经手动编译过交叉调试器):

假设您有:

  • 将要在其上进行所有编译的powerpc构建机器
  • 几个带有mips处理器的嵌入式设备,您的代码将在这些设备上运行
  • 您将用于在现场调试这些设备的x86笔记本电脑

您将配置并构建调试服务器(例如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链接或有关加拿大交叉编译的本节。

还要注意,实际上,您可能看不到指定的内部版本,主机或目标,因为根据此Autoconf手册页,“目标默认为host,要构建的主机,以及根据config.guess结果生成的主机”。

总之,建立在代码--build上运行它--host--target建筑环境。


11
如何找出要放置“主机”和“目标”的内容?
黑色

4
我猜您在谈论构建新的编译器,因为“ --target”仅与编译器相关。*“主机”是新编译器应运行的位置。*“目标”是新编译器生成的可执行文件应运行的位置。
user1735594

这不是一个错误的答案,因为--host = i686在这里无效吗?
2008年

1
提供的答案提到已针对MIPS目标完成了编译,这是构建,而主机是MIPS计算机的调试器。这是否意味着调试器/编译器也由powerpc构建?这是我从另一个用户(内德)获得的评论:build =我在哪里编译编译器,host =编译器将在哪里运行,target =编译器将生成什么代码。参考:stackoverflow.com/questions/7088576/...
supmethods

根据Ned的说法,这并不意味着powerpc既是构建/主机,x86机器是调试器的目标,又是MIPS系统的目标。您能否进一步解释什么是“为……而建”和“为……而建”?我指的是gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html
supmethods '18 -10-25

75

注意:--target只有在编译器(例如GCC)时,参数才有意义。configure在构建GCC之前运行时:

  • --build:您正在构建的机器
  • --host:您要制造的机器
  • --target:GCC将为其生成二进制文件的机器

GCC文档特定于主机/目标的安装说明):

如果构建,主机和目标都相同,则称为本机。如果构建和主机相同,但目标不同,则称为交叉。如果构建,宿主和目标都不同,则称为加拿大人(出于与加拿大政党和当时从事构建工作的人员的背景打交道的模糊原因)。如果主机和目标相同,但构建方式不同,则使用交叉编译器为其他系统构建本机。有人将此称为“主机x主机”,“交叉本机”或“交叉构建”本机。如果构建和目标相同,但宿主不同,则您将使用交叉编译器来构建交叉编译器,该交叉编译器将为要构建的计算机生成代码。这种情况很少见,因此没有通用的描述方式。有建议将其称为交叉。


2
显然,这意味着--target与本身不是编译器的任何项目都不相关。那么为什么它是标准的配置选项?令人困惑。
dhardy 2014年

1
@dhardy:configure并不是完美和干净设计的顶峰;我想这仅仅是特定于应用程序的功能蔓延的结果。
TimČas2015年

如果我想获得一个gcc,例如运行“ ./configure --build = powerpc --host = i686 --target = mips”,输出可执行文件是否残缺?通常,gcc是一个强大的工具,可以构建c代码,然后为多种平台输出多种结果。在这里,如果我使用'--target = mips',指定的gcc是否失去了功能?
gfan

也可能会更新config.guess和config.sub文件,以便编译器知道更多目标平台..您可以在此处获取它们:gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.