一、本地编译

之前常见的软件开发,大都属于本地编译。在当前 PC 环境下(比如 x86 CPU)直接编译出来可以运行的程序(或者库文件),其可以直接在当前的环境中运行。此时的编译就叫本地编译,在当前目标平台下编译出来的程序,也只能在当前平台下运行。

二、交叉编译

什么是交叉编译?

一个和本地编译相对应的概念。所谓的交叉编译,是指在一个平台上生成可以在另一个平台运行的代码,例如我们可以 32 位的 Windows 操作系统开发环境上,生成可以在64位 Linux 操作系统上运行的二进制程序。编译环境和运行环境不一样,属于交叉的,即 cross,交叉编译概念主要和嵌入式开发有关。交叉编译(cross compile)也记作 crosscompile, cross compiling 等。

为何要有交叉编译?

使用交叉编译的主要原因是,嵌入式系统中的资源太少,交叉编译出来的程序所要运行的目标环境拥有的各种资源都相对有限,很难直接进行本地编译。

比如,在进行嵌入式开发时,目标平台(嵌入式开发板,CPU 是最大主频 200MHz 的 ARM,32M 的 RAM,加上 1G 的 Nand Flash 等等)的硬件资源比较紧张,在运行嵌入式 Linux 的前提下,无法很方便地直接在嵌入式 Linux 下去本地编译(在 ARM 的 CPU 下编译出来供 ARM 的 CPU 可以运行的程序),这些编译开发都需要比较多的 CPU、内存、硬盘等资源,嵌入式开发上的那点资源只够嵌入式(Linux)系统运行,没太多剩余的资源来本地编译。

交叉编译 opencv 静态库 交叉编译环境_交叉编译 opencv 静态库

交叉工具链简介

什么是工具链

所谓的工具链,包含工具、链两部分。和程序编译链接等相关的 gcc,binutils 等工具按照先编译后链接等流程串(链)起来,就是工具链。

工具是用来干活的,这里要干的活是生成(可以运行的)程序或库文件,内部的执行过程逻辑主要包含编译、链接等。为了将程序代码编译成可执行文件,要经过编译、链接(等其他步骤),这个过程会依赖很多相关工具,最核心的就是编译器 gcc、链接器 ld。

1)编译

编译的输入(对象)是:程序代码

编译输出(目标)是:目标文件

编译所需要的工具是:编译器

编译器,常见的编译器 gcc

2)链接

链接的输入(对象)是:(程序运行时所依赖的,或者某个库所依赖的另外一个)库(文件)

链接的输出(目标)是:程序的可执行文件,或者是可以被别人调用的完整的库文件

链接所需要的工具是:链接器

链接器,即 ld

binutils 包含了 ld 等工具,上面所说的 ld 是处理操作目标文件、二进制文件的最主要的一个工具,和操作目标等文件相关的还有其他很多工具,比如 as,objcopy,strip,ar 等。GNU官网还出一个二进制工具包 binutils(即 binary utils),它集成了这些和操作二进制相关的工具集合。常见的工具就是著名的 GNU Binutils。

,即链条 chain,之所以称为链,说明不止一个东西(和程序编译链接等相关的 gcc、binutils 等工具),按照程序本身编译链接的先后顺序,即先编译,后链接,再进行后期其他的处理等(比如用 objcopy 去操作相应的目标文件等)串(链)在一起。

什么是交叉工具链

工具链指的是当前本地平台的工具链。用于交叉编译的工具链,就叫做交叉工具链,也常把交叉工具链简称为交叉编译器。

严格意义上来说,交叉编译器指的是交叉编译版本的 gcc。但是实际上为了叫法方便,常说的交叉编译器指的是交叉工具链。常说的交叉编译版本的 gcc,比如 arm-linux-gcc,实际上指代了包含一系列交叉编译版本的交叉工具链(arm-linux-gcc,arm-linux-ld,arm-linux-as等等)。

总结

交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由 binutils、gcc 和 glibc 三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。