我看到了很多冲突信息,希望得到一些澄清。构建、主机和目标
构建知道三个系统名称:您正在构建的机器(构建)、您正在为其构建的计算机(主机)和GCC将为其生成代码的机器(目标)。配置GCC时,可以使用--build=、--host=和--target=指定这些GCC。
实际上,我不明白在上面的定义中,主机和目标之间有什么区别。
其他页面显示
"主机"是用于编译代码的机器(或体系结构或平台);"target"是用于运行代码的机器(或体系结构或平台)。
这对我来说很有意义,但在这个解释中,主机是否总是与构建相同??我很困惑。
在我的情况下,我配置为编译器(GCC)运行在x8_64上,二进制可执行文件运行在ARM上。该程序是用C编写的,因此编译器是GCC。
./configure --build=x86_64 --host=x86_64 --target=arm-linux-gnueabihf
make
make install
听起来像构建时,主机都是x86_64,目标是arm。这是正确的吗?
我正在编译我自己的嵌入式程序,该程序运行在Jenkins机器(x86_64)上。嵌入式程序在基于ARM的机器上运行。
假设我有一台PowerPC机器正在制作一个编译器,您将在x86机器上使用(运行)该编译器,该编译器将制作在ARM上运行的二进制文件。
这使得PPC成为构建,x86成为主机,目标是ARM。正如巴西尔所评论的,这是一个加拿大十字架。
构建和主机不同的情况并不常见,但确实会发生这种情况。有时构建和主机甚至是相同的体系结构,但造成这种情况的环境有所不同。在我的x86上创建自定义工具链意味着构建和主机都是x86,但主机可能具有与构建不同的库或依赖关系版本。例如,当为在构建服务器上运行的嵌入式开发构建沙盒工具链时,就会出现这种情况。
"构建知道三个系统名称:在其上构建的机器(
build
)、为其构建的计算机(host
)以及GCC将为其生成代码的机器(target
)。当您配置GCC时,您可以用--build=
、--host=
和--target=
指定这些";
- 如果
build
、host
和target
都相同,则称为本机- 如果
build
和host
相同,但target
不同,则称为十字架- 如果
build
、host
和target
都不同,这就被称为加拿大人(出于与加拿大政党和当时建筑工作人员的背景有关的模糊原因)- 如果
host
和target
相同,但build
不同,则使用交叉编译器为不同的系统构建本机。
- 有些人称之为主机-x-host、交叉原生或交叉构建原生
- 如果
build
和target
相同,但host
不同,则使用交叉编译器构建一个交叉编译器,为您正在构建的机器生成代码。
- 这是罕见的,所以没有常见的描述方式。有人建议称之为横杆
来源:https://gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html
有人已经举了一个"加拿大人"的例子。
交叉编译的一个例子是,当从源代码(Linux声音库)构建sox
时,您需要为编解码器等提供32位二进制文件。我刚刚在64位机器上遇到这种情况,我想为自己的使用构建它,这意味着在这种情况下:
build
是host
(我的机器)target
是一个32位系统
这是我的理解,我同意这可能有点令人困惑,希望这有帮助:-)