交叉编译
近来一直忙于一个跨平台移植(porting from x86 to PowerPC)的一个项目,基本上整天是编译与交叉编译。下面想从以下几个方面谈一下交叉编译。
- 何为交叉编译?
- 何为交叉编译器?
- 为什么要交叉编译?
- 交叉编译应该注意哪些?
何为交叉编译?
所谓交叉编译(cross compiling)是指在一种平台上利用合适的交叉编译器来编译产生可以在另一种平台上运行的代码。具体体现是当你configure的时候指定的host和build不一样。这里的平台是指你的CPU架构,如i586, powerpc, arm等。
何为交叉编译器?
在一种平台上运行的编译器,它可以编译产生在另外一种平台上运行的可执行代码。这种编译器就叫做交叉编译器,在GNU LINUX中我们通常用GCC(gnu collection compiler). 它和常用的编译工具如AR, AS, LD Glibc 等一起叫做交叉编译工具链(cross compiling toolchain)
为什么要交叉编译?
主要是由于目标平台上的资源有限,如CPU很低,内存很少,硬盘空间有限等,本地编译器(native compiler)不可能运行在上面或者运行在上面编译东西很慢。从这里可以看出它主要运用在嵌入式开发上。
交叉编译应该注意哪些?
交叉编译毕竟不是在本地编译,所以配置的时候需要特别注意一些选项的指定,如–host, –target. 当你配置完后,最后检查一下生成的Makefile里的一些变量是否准确,如CC,INCLUDE等,如果有其它库的依赖,还要先交叉编译出这些库,然后在配置时指出它们的路径。一般可用file命令来检查编译出的文件是哪个平台的。常见的错误有以下几种
- --build类型auto guess错误,需手动指定,一般为i386-linux .
- 一些headers文件找不到,也就是说include的路径不对,有隐式的,有显示的。
- 一些常量没声明,可根据情况指定,如果你不知道它是什么,不要动它,检查其它方面
- 一些很怪的错误先到网上查找,如果没有答案,可以尝试用一些常用的版本,不要追求最新的版本
对powrpc交叉工具链的编译,请参考这里
Tags: 交叉编译, cross-compiling