重新认识交叉编译

1. 我以前对交叉编译的认知

引用正点原子的话来讲就是:

说得对,但是不全面,直到最近项目中遇到了一个例子我才重新认识什么是交叉编译。

2. build/host/target的概念

参考Cross-Compilation (automake)

参考Specifying Target Triplets (Autoconf)

所以这里理解交叉编译与交叉编译器很重要:

先说交叉编译: 这里只需要build和host,build代表可执行程序的编译环境,host代表编译出来的可执行程序的执行环境,只要build和host不同,就叫交叉编译。

再说交叉编译器: 编译器首先也是一个执行程序,它也要被编译出来,它有自己的build环境(编译器在哪里被编译的),它有自己的运行host环境(编译器在什么环境运行),那么这里编译编译器本身可能是一个交叉编译行为(cross-compile,build != host),也可能不是一个交叉编译行为(native-compile,build == host); 另外,编译器本身可以编译程序,由编译器编译出来的程序的运行环境由target来指定,这里有可能build、host、target三者都相等,也有可能三者都不相等,也有可能build和host相等且与target不相等。

所以这里总结一下,如果是编译器本身,看它的build和host是否相同,来判定该编译器是否被交叉编译;如果是可执行程序,看该可执行程序的build和host是否相同,来判定该可执行程序是否被交叉编译,同时也可以看编译该可执行程序的编译器的host与target是否相同来判定该可执行程序是否被交叉编译。

3. 编译链的种类

上面小节说到,对于编译器,它的build、host、target情况可能不同,对此分了如下类别:

参考Toolchains - eLinux.org

  • native toolchain
  • cross-compilation toolchain
  • cross-native toolchain
  • canadian toolchain

4. 趣事: canadian toolchain和加拿大有啥关系?

参考https://en.wikipedia.org/wiki/Cross_compiler#Canadian_Cross

参考什么是native compiler?什么是cross compiler? | 懒惰的程序员

好吧,奇奇怪怪的知识又增加了。

5. 一些编译器的例子

X86 native toolchain:

X86 cross-compile toolchain:

ARM native toolchain:

ARM64 native toolchain:

ARM64 cross-compile toolchain:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值