交叉編譯器arm-linux-gcc


(一)交叉編譯器簡介

   在一種計算機環境中運行的編譯程序,能編譯出在另外一種環境下運行的代碼,這個編譯過程就叫交叉編譯.簡單地說,就是在一個平台上生成另一個平台上的可執行代碼.
(二)體系結構與操作系統

(1)常見的體系結構有ARM結構、x86結構等.

(2)常見的操作系統有linux,windows等.

(3)同一個體系結構可以運行不同操作系統,如x86上可以運行Linux、Windows等,在ARM上可以運行Linux、WinCE.

(4)同一個操作系統可以在不同的體系結構上運行,比如Linux可以運行在x86上,也可以運行在ARM上.

(5)同樣的程序不可能運行在多個平台上,比如Windows下應用程序不能在Linux下運行.如果一個應用程序想在另一個平台上運行,必須使用針對該平台的編譯器,來重新編譯該應用程序的二進制代碼.比如在Linux系統下運行Windows平台的QQ軟件,必須按照以下幾個步驟:
  1.QQ程序源代碼
  2.使用Linux下的編譯器來編譯QQ軟件的源代碼
  這樣編譯出來的可執行程序就可以在Linux下運行了.所以,如何使ARM來運行用戶的應用程序呢,就需要用到針對ARM的編譯器來編譯程序.

(三)使用交叉編譯器的原因

    ARM上可以運行操作系統,所以用戶完全可以將ARM當做計算機來使用,理論上也可以在ARM上使用本地的編譯器來編譯程序.但是,編譯器在編譯程序時,會產生大量的中間文件,這會占用很大的內存和磁盤空間,且對CPU處理速度要求較高,比如S3C2440A內存、磁盤空間只有幾十到100多兆,CPU只有400-500MHz,完全達不到編譯程序的要求.所以,在進行ARM-linux嵌入式開發時必須在PC機(x86結構)上編譯出能夠運行在ARM上的程序,然后再將程序下載到ARM中來運行.這就用到了交叉編譯器.

   要進行交叉編譯,用戶需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然后用這個交叉編譯工具鏈編譯用戶的源代碼,最終生成可在目標平台上運行的代碼.交叉編譯工具鏈可以從網上下載,也可以自己制作.但編譯器不是萬能的,受版本限制,編譯某些程序時會報錯.常見的交叉編譯工具鏈有:

   (1)Cross -2.95.3 tar:  該版本較早,除了編譯vivi外一般不使用.

   (2)arm920t-eabi.tgz:  4.1.2版本的編譯器,支持eabi,可以編譯TX2440A開發板上的所有程序.

   (3)arm-linux-gcc:  4.3.2版本的編譯器,支持eabi,是最常見的交叉工具鏈.

   Attention!!!

   什么是EABI
   EABI,Embeded application binary interface,即嵌入式應用二進制接口,是描述可連接目標代碼、庫目標代碼、可執行文件影像、如何連接、執行和調試以及目標代碼生成過程,和c, c++語言接口的規范,是編譯連接工具的基礎規范,也是研究它們工作原理的基礎.簡而言之,EABI就是一種編譯規范,交叉編譯器在編譯時,對於浮點運算會使用硬浮點運算,而對於沒有硬浮點運算的處理器,比如S3C2440,會使用軟浮點,但這樣會在速度上受到很大的限制,而EABI則對浮點運算進行了優化,提高了浮點運算的性能,節省了編譯時間.


(四)安裝交叉工具鏈arm-linux-gcc 4.3.2

   安裝交叉編譯器arm-linux-gcc就是在主機平台(pc機的Linux操作系統)上安裝對應的交叉編譯工具鏈,換句話說,是將交叉編譯器arm-linux-gcc 4.3.2在Linux操作系統下安裝.安裝步驟:

(1)啟動Samba服務器,打開共享目錄/home/lishuai,將壓縮文件arm-linux-gcc-4.3.2.tgz復制到/home/lishuai下.

(2)解壓軟件包arm-linux-gcc-4.3.2.tgz.

  [root@localhost lishuai]#tar xzvf arm-linux-gcc4.3.2.tgz

   1.目錄4.3.2就是該交叉編譯器的目錄.從arm-linux-gcc-4.3.2.tgz解壓信息來看,該軟件包需要解壓在usr/local/arm下,而實際卻解壓到了共享目錄/home/lishuai下                              

   2.進入目錄usr/local/內,並沒有找到arm文件夾,所以需要新建一arm文件夾,再將目錄4.3.2移動到新建目錄usr/local/arm下.其中,4.3.2/bin就是arm-linux-gcc的可執行文件.
   [root@localhost local]#mv  /home/lishuai/usr/local/arm/4.3.2  ./      

   3.進入目錄/usr/local/arm/4.3.2/bin,可以看到不同類型的編譯器.但在ARM下經常用到是arm-linux-gcc.其實它也是一個gcc編譯器,與gcc使用方法一致,不過該編譯器是針對arm體系結構、Linux操作系統的編譯器.利用該編譯器就可以編譯出運行在ARM上的Linux操作系統下的應用程序.

  4.進入目錄/usr/local/arm/4.3.2/arm-none-linux-gnueabi.其中,lib目錄下存放的是庫文件,用戶編寫的應用程序在運行時就依賴於這些庫文件.

  5.此時還不能編譯源碼,系統一般會提示找不到命令arm-linux-gcc.這是環境變量在作祟.所以必須修改環境變量PATH.
   [root@localhost lishuai]#vi /etc/profile                           

   在"export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC"這一行的下面添加環境變量,
   輸入:export PATH=/usr/local/arm/4.3.2/bin:$PATH
   指定變量PATH為交叉編譯器的路徑,目的是告訴操作系統可以到目錄/usr/local/arm/4.3.2/bin下查找可執行文件
  6.[root@localhost lishuai#:source /etc/profile

    //使已修改的配置文件/etc/profile生效

  7.查看arm-linux-gcc編譯器的版本

   [root@localhost lishuai]#arm-linux-gcc -v

(五)arm-linu-gcc應用實例

實例:如何使用交叉編譯器編譯源碼包boa-0.94.13.tar.tar
1. 啟動SMB服務器,將源碼包放在共享文件夾/home/lishuai下
2. 輸入命令: tar xzvf boa-0.94.13.tar.tar

   //解壓該源碼包           

   //一般的源碼包內有Makefile文件,執行make就可以編譯,但該源碼包內沒有,此時執行make是無效的       

   //仍然沒有Makefile,但找到了configure文件,通過執行configure文件可以生成Makefile
     [root@localhost lishuai]# ./configure                               

  //運行configure文件,生成了Makefile文件
  
//由於要編譯出在ARM平台上的程序,就需要使用交叉編譯器.在Makefile文件內的綠色大寫字母都是Makefile變量,可以看到變量CFLAGS = -g -o2 -pipe -Wall -l,該變量是設置編譯選項;變量CC = gcc,該變量是設置需要使用的編譯器.由於要使用交叉編譯器arm-linux-gcc,所以該變量應設置為CC = arm-linux-gcc,CPP = arm-linux-gcc -E,保存並退出.
    [root@localhost lishuai]#make         

  //執行make進行編譯
  //生成名為boa的可執行程序,該程序可下載到ARM內來執行

   其實,這個過程也叫做移植.移植就是將一個源碼包經過修改、配置、交叉編譯,然后下載到一個平台上運行.比如經常移植的有Bootloader、內核、QT等.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM