Linux之交叉编译概要总结

1】交叉编译详解 网址:http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html#crosscompiler_tools


交叉编译概要总结


1.1. 什么是交叉编译

解释什么是交叉编译之前,先要明白一个概念:本地编译。而所谓的,交叉编译,就是:编译的环境,和运行的环境,不一样,属于交叉的,此所谓cross

1.2. 为何要有交叉编译

主要原因是:嵌入式系统中的资源太少。

具体的解释就是:交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。

例如:在进行嵌入式开发时,目标平台,即嵌入式开发板,比如是最大主频200MHzARMCPU,加上32MRAM,加上1GNand Flash等等。

3.1. 交叉编译器的名字的命名规则

3.1.1. 交叉编译器名字举例

arm-xscale-linux-gnueabi-gcc

arm-liunx-gnu-gcc

3.1.2. crosstool-ng中交叉编译前缀的命名规则

crosstool-ng中,交叉编译器的(前缀)的名字的命名规则是:

arch-vendor-kernel-system

3.1.2.1. 交叉编译器名字中的arch部分

arch,即系统架构即,用此交叉编译器编译出来的程序,是运行在哪种CPU上面的arch的值,常见的有很多种,比如armx86mips等等。

3.1.2.1.1. crosstool-ng中arch的值

crosstool-ng中,和arch对应的值,应该就是"Target options"中的"Target Architecture"的值了。

比如常见的,配置为arm的话,就是:

Target options

  Target Architecture (arm)  --->

对应的配置参数是:ARCH_arm

3.1.2.2. 交叉编译器名字中的vendor部分

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. 交叉编译器名字中的kernel部分

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

3.1.2.4. 交叉编译器名字中的system部分

system,直译为,系统

其实主要表示的,交叉编译器所选择的库函数和目标系统

最常见的一些值有,gnugnueabiuclibcgnueabi等等。

3.1.2.4.1. system中的gnu

貌似是:

gnu == gnu libc == glibc

即,gnu,就是表示用的是glibc的意思。

3.1.2.4.1.1. crosstool-ng中system为gnu的情况

crosstool-ng中, 和systemgnu对应的值,应该就是"C-library"中的"C library"的值设置为"glibc"了。

C-library

  C library (glibc)  ---> 

对应的配置参数是:CT_LIBC_glibc

3.1.2.4.2. system中的eabi

3.1.2.4.2.1. crosstool-ng中system为eabi的情况

crosstool-ng中,和systemeabi对应的值,应该就是"Target options"中的"-*- Use EABI"的值了。

Target options

  -*- Use EABI

注意:此处是选择的ARMEABI在此处,已经是默认,无法修改的值,只能是EABI了。

3.1.2.4.3. system中的uclibc

uclibc,是c库中的一种

crosstool-ng中,目前支持三种:glibc(GNU C Library),eglibc(Embedded GLIBC),uclibc(u意思是μMicro,微小的意思。

glibcuClibceglibc都是C语言函数库:

1. uClibc是嵌入式系统中用的(不支持MMU),glibc是桌面系统用的

2. eglibc也是嵌入式系统中用的(资源占用少),是glibc的嵌入式版本,和glibc在源码和二进制上兼容。

3.1.2.4.3.1. crosstool-ng中system为uclibc的情况

crosstool-ng中,和systemuclibc对应的值,应该就是"C-library"中的"C library"的值设置为"uClibc"了。

C-library

  C library (uClibc)  --->

对应的配置参数是:CT_LIBC_uClibc

所以,针对上述,gnueabiuclibc等几个选项,对应的常见的一些组合的含义是:

gnu

等价于:glibc+oabi

gnueabi

等价于:glibc+eabi

uclibc

等价于:uclibc+oabi(待确认)

 3.4. 举例:交叉编译器中的system的值

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. 如何得到交叉编译器

3.2.1. 拿来主义:直接去下载和使用别人已经编译好的交叉编译器

3.2.2. 自己动手,丰衣足食:自己去编译出来一套自己想要的交叉编译器

3.2.2.1. 白手起家从头开始制作交叉编译器

3.2.2.2. 借助别人的工具去制作交叉编译器

3.3. 各种制作交叉编译器的工具

3.3.1. crosstool-NG  2016-3-2:可以下载代码实验看看make menuconfig选项)

3.3.2. Buildroot  2016-3-2:可以下载代码实验看看make menuconfig选项)

Buildroot可以用来,制作自己的交叉编译器,制作自己的根文件系统,把ubootLinux kernel集成到Buildroot中一起编译。

3.3.3. crosstool

3.3.4. Embedded Linux Development Kit (ELDK)

3.3.5. OpenEmbedded的BitBake

3.3.6. Crossdev

3.3.7. OSELAS.Toolchain()

3.4. 使用已有的交叉编译器和自己手动编译交叉编译器之间的对比

3.4.1. 使用已有交叉编译器的优点

3.4.1.1. 已有的交叉工具链的下载

3.4.2. 使用已有交叉编译器的缺点

3.4.3. 自己手动编译交叉编译器的优点

3.4.4. 自己手动编译交叉编译器的缺点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值