要想理解交叉编译,首先要理解CPU的架构。 下面从几个方面开始说。
1. CPU的设计规范 设计一款CPU,要遵循CPU设计规范,也就是指令集。目前的指令集主要有两种,一种是X86架构,一种的ARM架构。(当然非主流的还有MIPS指令集、RISC-V指令集,二者基于RISC精简指令集) 英特尔和AMD采用的都是X86的指令集架构。 手机、平板采用的是ARM的指令架构。
ARM架构与X86架构的区别是: ARM主要是RISC精简指令集。 X86主要是复杂指令集CISC。
2. 微架构 指的是芯片的电路结构。相同的指令集可能会有不同的微架构。 比如英特尔和AMD都是X86的指令集,但是拆开芯片看到的微结构却相差很多。 微架构主要包括:运算单元、逻辑单元、寄存器等在三态,总线和单向总线、控制线的连接下组成了CPU的微架构。 3 . 交叉编译原理 交叉编译的概念指的是,在不同的平台编写、编译代码、运行。 这里所说的平台,需要详细说明一下。一个是体系结构,也就是上文所说的CPU的设计使用的架构。一个是操作系统。 二者均为平台所包含的内容。其中: 体系结构: x86、arm、MIPS、RISC-V等 操作系统:Windows、linux、VCE、vXworks 同一体系结构可以运行不同的操作系统,比如基于x86的pc机可以运行windows操作系统,也可以linux。 arm可以运行linux、也可以vxworks。 同一种操作系统也可以运行在不同的体系结构下。 比如我们编写代码一般是在windows下,编译代码一般是在linux下,而linux服务器一般是X86架构的(指的是用的Intel或者AMD的CPU芯片),这样编写出来的代码不可以在arm架构的开发板上运行。这时候就需要交叉编译,就是说在X86的机器上编译出能够在arm上运行的文件。 但同一个应用程序,不可能在多个平台下运行。如果想要运行,必须拿到这个应用程序的源代码,使用此平台特定的编译器, 编译后才可以在此平台运行。 因此想要编写在arm上运行的程序,就需要arm专用的编译器。
4. 为何不在嵌入式设备上编译?
因为编译对机器性能要求特别高,因为编译过程中会产生大量的中间文件,占用磁盘,只有机器性能好,编译才能够快速。嵌入式设备一般CPU处理速度比较慢、内存小、安装编译器内存不够等等。 所以一般都是在服务器上编译,在开发板上运行。
所以步骤是:现在pc的linux系统下安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。
5 . 编译原理、gcc使用
(1) 编译的阶段: (2) 编译使用的编译器 (3) gcc后参数,指定编译阶段 在编译过程中,系统会默认的在/usr/include文件夹中搜索系统的头文件,在/lib或者/usr/lib文件夹中搜索系统的库文件。 如果引用的头文件或者库文件不在上述文件路径,在需要使用-IDIR参数 +头文件搜索路径,使用-LDIR参数+库文件搜索路径,-ILIBRARY指令链接时需要的其他函数库。 (5) gcc和g++编译c++程序的不同 gcc只能编译C++源程序,不能与C++包含的库链接。 g++可以。
|