https://tutorial.linux.doc.embedfire.com/zh_CN/latest/linux_basis/why_learning_linux.html
目前我了解到的嵌入式linux教程基本都是基于Ubuntu的,这就让我产生了疑惑,windows不香嘛,为什么要安装完虚拟机再在虚拟机上进行开发???由此,我了解到了交叉编译,即在一种平台上编译编译另一种平台的代码,英文名称 cross compile,既然牵扯到两个平台,我们就要知道一共有几种平台,按照大类可分为两种,即精简指令集(RISC)与复杂指令集(CISC),再往下细讲就是常见的x86属于复杂指令集,ARM属于精简指令集,其他的几种平台(或者说成是架构,以下内容架构与平台概念相同)还有MIPS、PowerPC等等,其他的由于我暂时没有听到过,在此先不提及,以免给大家带来困惑。
具体大家有兴趣可以参考这篇博客
CPU架构的分类
https://blog.csdn.net/lele52141/article/details/5732962
为什么会有交叉编译,交叉编译的重点与难点在哪里??由于技术水平有限,在一张博客里面截取一张进行展示
交叉编译的难点在于:
1.不同架构的机器位数不同,即32位还是64位
2.不同架构的机器是大端系统,还是小端系统
3.不同架构的机器是否为四字节对齐访问
4.不同架构的机器是否支持MMU,即内存管理单元
5.不同架构的机器所支持的库以及开发环境都不相同 基于以上介绍,我们对应的措施是什么??
我们的电脑属于x86架构,而最终要运行的程序要运行在ARM架构上,所以这就用到了交叉编译,但无论是Windows系统的主机电脑还是虚拟机中的Ubuntu都是x86的架构,所以至少在裸机开发阶段,交叉编译是我们绕不过去的坎。其实,对于stm32的开发,在keil里完成的也是交叉编译的工作,只不过keil做的比较封闭,我们注意不到这些细节。(其次,名字也比较高大上,大家一般不会往这上面去想,类似的比如我们在单片机中死循环不断读取传感器数值的方法叫做轮询,好多东西并不是不知道,而是没有和专业的名字对应起来)
知道了是交叉编译,工作如何完成??当然是选择合适的工具啦(ps:我们都不是linus,系统不让用自己做一个linux,版本管理工具不好用自己写一个git),我们的目标就是什么没有找什么,什么不会搜什么,但是名字是关键,它叫做“交叉编译工具链”。这个一会再说。
首先说一下,编译器,我们最常见的就是gcc编译器,类似的c语言程序都是gcc编译之后才可以运行的。编译的步骤现在我都可以直接背出来了,这个必须记住,这对于我们来说就像语言的语法,极其重要,不然之后的交叉编译工作就能无法完成(因为开始ARM裸机开发,别人给你灌输的最多的就是编译,编译,再编译)。
四个步骤:预处理,编译,汇编,链接。预处理主要是宏定义,头文件展开展开等,编译主要是检查语法错误生成汇编文件,汇编主要是生成目标文件,链接是将目标文件链接到一起生成可执行文件。(以上过程全部为我默写出来,嘻嘻)。这是C语言的编译过程,也是大多数程序的编译过程。
二对应到编译ARM的程序上,也是这个过程,只不过用到的工具不同
也可以叫做交叉编译工具链,在此我们进行谷歌搜索
接下来结合我自己理解,展开介绍
首先肯定的是交叉编译工具链是一套工具的集合,而不是单独的一个工具,类似于我们上面提到的编译的四个过程,都有对应的工具,(对应的工具完成对应的任务,自古如是),这也就是为什么我们要记下编译的具体步骤。
正点原子给我们推荐的是 arm-linux-gnueabihf这一套工具链这也是 #我们使用交叉编译链时,常常会看到这样的名字: arm-none-linux-gnueabi-gcc arm-cortex_a8-linux-gnueabi-gcc mips-malta-linux-gnu-gcc #这些交叉编译链的命名规则似乎是通用的,有一定的规则: arch-core-kernel-system arch: 用于哪个目标平台。 core: 使用的是哪个CPU Core,如Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。 kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS)。 systen:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi 等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。