【1】交叉编译详解 网址:http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html#crosscompiler_tools
交叉编译概要总结
解释什么是交叉编译之前,先要明白一个概念:本地编译。而所谓的,交叉编译,就是:编译的环境,和运行的环境,不一样,属于交叉的,此所谓cross。
主要原因是:嵌入式系统中的资源太少。
具体的解释就是:交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。
例如:在进行嵌入式开发时,目标平台,即嵌入式开发板,比如是最大主频200MHz的ARM的CPU,加上32M的RAM,加上1G的Nand Flash等等。
arm-xscale-linux-gnueabi-gcc
arm-liunx-gnu-gcc
3.1.2. crosstool-ng中交叉编译前缀的命名规则
crosstool-ng中,交叉编译器的(前缀)的名字的命名规则是:
arch-vendor-kernel-system
arch,即系统架构即,用此交叉编译器编译出来的程序,是运行在哪种CPU上面的arch的值,常见的有很多种,比如arm,x86,mips等等。
3.1.2.1.1. crosstool-ng中arch的值
crosstool-ng中,和arch对应的值,应该就是"Target options"中的"Target Architecture"的值了。
比如常见的,配置为arm的话,就是:
Target options
Target Architecture (arm) --->
对应的配置参数是:ARCH_arm
vendor,即生成厂家表示谁提供的,即谁制作出来这个交叉编译器的,貌似是可以自己随便填写的。通用的做法,好像是:把vendor写成,体系架构的值,比如我之前针对xscale的去配置crosstool-ng的时候,就写了个xscale。或者写成CPU的厂家的名字,或者是开发板的名字等等。
3.1.2.2.1. crosstool-ng中vendor的值
crosstool-ng中,和vendor对应的值,应该就是"Toolchain options"中的"Tuple's vendor string"的值了。
比如我之前配置为xscale的话,就是:
Toolchain options
(xscale) Tuple's vendor string
对应的配置参数是:CT_TARGET_VENDOR
3.1.2.3.1. crosstool-ng中kernel的值
crosstool-ng中,和kernel对应的值,应该就是"Operating System"中的"Target OS"的值了。
比如我之前配置为Linux的话,就是:
Operating System
Target OS (linux) --->
对应的配置参数是:GEN_CHOICE_KERNEL中的CT_KERNEL_linux
system,直译为,系统
其实主要表示的,交叉编译器所选择的库函数和目标系统
最常见的一些值有,gnu,gnueabi,uclibcgnueabi等等。
貌似是:
gnu == gnu libc == glibc
即,gnu,就是表示用的是glibc的意思。
3.1.2.4.1.1. crosstool-ng中system为gnu的情况
crosstool-ng中, 和system中gnu对应的值,应该就是"C-library"中的"C library"的值设置为"glibc"了。
C-library
C library (glibc) --->
对应的配置参数是:CT_LIBC_glibc
3.1.2.4.2.1. crosstool-ng中system为eabi的情况
crosstool-ng中,和system中eabi对应的值,应该就是"Target options"中的"-*- Use EABI"的值了。
Target options
-*- Use EABI
注意:此处是选择的ARM,EABI在此处,已经是默认,无法修改的值,只能是EABI了。
uclibc,是c库中的一种
crosstool-ng中,目前支持三种:glibc(GNU C Library),eglibc(Embedded GLIBC),uclibc(u意思是μ,Micro,微小的意思。)
glibc,uClibc,eglibc都是C语言函数库:
1. uClibc是嵌入式系统中用的(不支持MMU),glibc是桌面系统用的
2. eglibc也是嵌入式系统中用的(资源占用少),是glibc的嵌入式版本,和glibc在源码和二进制上兼容。
3.1.2.4.3.1. crosstool-ng中system为uclibc的情况
crosstool-ng中,和system中uclibc对应的值,应该就是"C-library"中的"C library"的值设置为"uClibc"了。
C-library
C library (uClibc) --->
对应的配置参数是:CT_LIBC_uClibc
所以,针对上述,gnu,eabi,uclibc等几个选项,对应的常见的一些组合的含义是:
gnu
等价于:glibc+oabi
gnueabi
等价于:glibc+eabi
uclibc
等价于:uclibc+oabi(待确认)
arm-cortex_a8-linux-gnueabi中的gnueabi,即glibc+eabi
mips-ar2315-linux-gnu中的gnu,即glibc+oabi
powerpc-e500v2-linux-gnuspe中的gnuspe,没搞懂啥意思。。
x86_64-unknown-mingw32中的mingw32,用的是Windows下的mingw32的库
3.2.1. 拿来主义:直接去下载和使用别人已经编译好的交叉编译器
3.2.2. 自己动手,丰衣足食:自己去编译出来一套自己想要的交叉编译器
3.3.1. crosstool-NG (2016-3-2:可以下载代码实验看看make menuconfig选项)
3.3.2. Buildroot (2016-3-2:可以下载代码实验看看make menuconfig选项)
Buildroot可以用来,制作自己的交叉编译器,制作自己的根文件系统,把uboot,Linux kernel集成到Buildroot中一起编译。
3.3.4. Embedded Linux Development Kit (ELDK)
3.4. 使用已有的交叉编译器和自己手动编译交叉编译器之间的对比