在嵌入式开发中,经常会遇到目标平台资源贫乏,无法运行需要的编译器。亦或是目标平台上不允许或不能够安装需要的编译器。这时候就需要使用交叉编译了。
交叉编译
本地编译:在当前目标平台下,编译出来的程序,放到当前平台下,就可以运行的
交叉编译:在一种平台上编译,编译出来的程序,放到别的平台上运行(编译和运行环境不一样,属于交叉的)
这里所谓的平台,实际上包含两个概念:体系结构和 操作系统 。同一体系结构可以运行不同的操作系统,同一操作系统也可以在不同的体系结构上运行。
比如x86 Linux平台,实际上是Intel x86体系结构和Linux for x86操作系统的统称。
再比如x86 WinNT平台,实际上是Intel x86体系结构和Windows NT for x86操作系统的统称。
交叉编译是一个和本地编译,相对应的概念。主要和嵌入式开发有关,由于嵌入式系统中的各种资源相对有限,只够嵌入式系统运行的,没太多剩余的资源,所以很难进行直接的本地编译。
交叉编译工具链
编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:
编译过程包括了预处理、编译、汇编、链接等功能。每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。
同时编译过程又是一个有先后顺序的流程,牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,形成了一个编译工具链。
交叉编译工具链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。
同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。
交叉编译工具链命名规则 :
在使用交叉编译链时,常常会看到下面这样的名字:
arm-linux-gnueabihf- arm-none-linux-gnueabi- arm-cortex_a8-linux-gnueabi- mips-malta-linux-gnu-
这些交叉编译链的命名通常会遵循一定的规则:arch-vender-os-abi,各字段说明如下:
arch:目标cpu架构,比如mips、arm、x86、riscv等,通常不会省略
vendor:提供此编译工具链的厂商名称或特定信息,标识信息,没有实际意义,可以为none、cross、unknow或是直接省略
os:目标设备上运行的操作系统,常见的有linux、none(裸机)等
abi:应用程序二进制接口,交叉编译链所选择的库函数和目标映像的规范,常见的值有abi 、eabi(embedded abi)、gun(glibc+oabi)、gnueabi(glibc+eabi)、gnueabihf(hf 指默认编译参数支持硬件浮点功能)等
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !