首页 > 代码库 > 玩转开发板之交叉编译器安装

玩转开发板之交叉编译器安装

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

       有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
 一、交叉编译器介绍

  交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。 

       要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下: 
      1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
      2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。 
      3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
       而我今天要使用的是uclibc,用它的库来自制一个交叉编译器。它与glibc有一点差别,会在下一篇文章介绍。
二、交叉编译器安装以及测试
    1.准备交叉编译器源码包
       首先进入网址https://buildroot.org/downloads/,我们会发现很多版本,我们找到build-root-2012.08.tar.bz2,复制链接。

       然后我们进入虚拟机,进行如下操作。

        [wangchao2@localhost opt]$chmod  777  /opt  #设置opt的权限

       [wangchao2@localhost opt]$wget  build-root-2012.08.tar.bz2 #获取压缩包文件

        [wangchao2@localhost opt]$tar -xjf   build-root-2012.08.tar.bz2#解压压缩包文件

        [wangchao2@localhost opt]$cd    build-root-2012.08

        [wangchao2@localhost build-root-2012.08]$ls

   2.开始配置编译安装

    [wangchao2@localhost build-root-2012.08] $ export TERM=vt100 防止make menuconfig出现乱码

   [wangchao2@localhost build-root-2012.08]$ make menuconfig 进行builroot配置

   [wangchao2@localhost build-root-2012.08]$ make
   编译的过程中可能会提示缺少某些命令(譬如g++,makeinfo,ncurses),这时就使用yum或rpm命令安装缺少的相应rpm包。

buildroot-2012.08 make menuconfig 选项配置说明
=======================

Target Architecture (ARM (little endian)) --->
Target Architecture Variant (arm920t) ---> 根据自己的CPU来选择
Target ABI (EABI) --->
Build options --->
($(TOPDIR)/dl) Download dir
($(TOPDIR)/arm920t) Host dir
[*] prefer static libraries
其它选项都不要选,如果是要设置值的地方就使用默认值

Toolchain --->
Kernel Headers (Linux 2.6 (manually specified version)) --->
(2.6.37) linux version 选定内核版本为2.6.37
... ...
[*] Enable compiler tls support
[*] Enable MMU support
[*] Use software floating point by default
[*] Enable large file (files > 2 GB) support
[*] Enable IPv6 support
[*] Enable RPC support
[*] Enable WCHAR support
[*] Enable C++ support

其它选项都不要选,如果是要设置值的地方就使用默认值


System configuration --->
Init system (None) ---> 把Busbyox编译去掉
这里面所有的都不要选,如果是要设置值的地方就使用默认值

Package Selection for the target --->
这里面所有的选项都不要选,除了:
Libraries --->
Compression and decompression --->
[*] lzo
-*- zlib

Host utilities --->
这里面所有的选项都不要选

Filesystem images --->
这里面所有的选项都不要选

Bootloaders --->
这里面所有的选项都不要选

Kernel ---
这里面所有的选项都不要选

 

3.交叉编译器测试

  首先我们先写一个hello.程序

  #include<stdio.h>

  int main()

 {
 printf("hello");
 return 0;
 }

  然后我们用交叉编译器来编译这个c文件,然后用file命令查看文件属性,会看到这个文件在ARM下运行,就代表配置完成,具体如下:

[wangchao2@localhost ~]$ /home/wangchao2/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc hello.c -o hello
[wangchao2@localhost ~]$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
[wangchao2@localhost ~]$

 

 

 

       

      

玩转开发板之交叉编译器安装