最近处理一个问题,需要在Ubuntu下使用GCC编译出多个平台版本做验证,发现对交叉编译这块有点模糊。导致工作效率略受影响,因此打算学习一下。
交叉编译
交叉编译器(Cross Compiler)就是一个可以编译在别的平台运行的程序的编译器。例如在Windows上编译安卓APK的编译器就是交叉编译器。
在交叉编译中,通常将编译可执行文件或者库文件的机器称之为构建平台,而将这些可执行文件或者库文件运行的平台称为宿主平台。
导致交叉编译器出现主要有一下几个原因:
- 某些设备资源有限无法运行编译器,例如8051单片机,显然不能指望它自己编译程序,它的资源有限到甚至系统都没有;
- 需要对一套代码编译出在不同平台运行的版本,比如你想让你的程序可以运行在Windows,Ubuntu,Mac等不同系统,又不想在每一种上配置一遍编译环境;
- 可以多台机器联合编译,提高效率;
- 为刚出现的机器编译它的系统和编译器等。
交叉编译器,并不是仅仅只有一个编译器,他还涉及链接器、调试器、标准库等等,这些统称为工具链。
在GNU中,对交叉编译器的命名有一个非强制的约定,交叉编译器的命名形式为:name-arch-[vendor]-os-[abi] (os = system / kernel-system)
,例如gcc-arm-linux-gnueabi
就是编译的目标平台是基于AMR芯片的Linux上,由于这个名字只是个约定,因此并不是大家都遵守。可能顺序上有些不同,例如可能vendorh会在arch之前。但是一般