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: