什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓
平台,实际上包含两个概念:体系结构(
Architecture
)、操作系统(
Operating System
)。同一个体系结
构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
嵌入式系统往往资源都是很有限的,如果其资源和我们平常用的桌面计算机(在嵌入式系统开发中我们称之为主机, host machine )一样,那我想可能就不存在交叉编译这么一说了。最为典型的是,嵌入式系统的内存往往是几兆字节,且只有 FLASH 而没有硬盘这种大容量存储设备。也就是说在这种资源有限的环境中,我们 不可能 将我们的开发工具安装在嵌入式设备中(在嵌入式系统开发中我们称之为目标机, target machine ),然后象我们平时做桌面开发那样,在上面进行编码、调试最后发布软件。
现实情况是,嵌入式系统的开发是在主机上进行的,那就存在一个问题:当我们的目标机处理器与主机的处理器不同时(比如目标机是 ARM 处理器,而主机是 x86 处理器),在这种请况下,如何保证在主机上编译的程序能在目标机上运行呢? 答案在于编译器上 !我们说嵌入式开发用的编译器与我们平时做桌面开发的编译器是不同的,在平时,我们的编译器是运行在什么处理器上,其编译出来的可执行程序也是运行在同样的处理器上的。实际上, 我们可以让一个编译器运行在 x86 主机上,却编译出可以在 ARM 上运行的可执行程序 ,这种编译器就是交叉编译器( cross compiler ),而采用交叉编译器进行编译就是指交叉编译( cross compiling ),而交叉编译器相关的环境就是指交叉编译环境( cross compiling environment )。
举一个例子,这个例子就是
VxWorks
(
一种嵌入式实时操作系统
)的
Workbench
(在早期版本中是
Tornado
协同仿真环境
)。这是一个
VxWorks
的开发环境,其除了采用
Eclipse
作为
IDE
外,后面采用的是
GNU
的
GCC
编译器进行程序编译。有人可能要问,
GCC
能运行在
Windows
上?其实,
GCC
不是直接运行在
Windows
上的,
Workbench
采用
Cygwin
(
在
windows
平台上运行的
unix
模拟环境
)作为其编译器的支撑环境,也就是说
GCC
及其
binutils
是运行在
Cygwin
上的。采用
Workbench
我们可以开发几乎所有主流处理器的嵌入式产品,而所有的工作都在
Windows
上完成的!
至此,相信你对交叉编译、交叉编译器和交叉编译环境有了很好的了解了。