安裝交叉編譯器arm-linux-gcc


原文鏈接:
http://blog.csdn.net/hanzengyi/article/details/5991915

(一)交叉編譯器簡介

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

(二)體系結構與操作系統

(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 (我下的是4.4.3)

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

(1)網上下載個壓縮包,我下載的是arm-linux-gcc-4.4.3-20100728.tar.gz,地址:http://arm9.net/download.asp

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

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

   1.目錄4.4.3就是該交叉編譯器的目錄.從arm-linux-gcc-4.4.3.tgz解壓信息來看,該軟件包需要解壓在usr/local/arm下

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

我用的命令是: #cp -rv /media/文檔/opt/FirendlyARM/toolschain/4.4.3 /usr/local/arm 就是把4.4.3這個文件夾拷貝到/usr/local/arm下

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

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

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

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

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

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

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

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

我這邊寫了個簡單的helloWorld.c程序

#include <stdio.h>

int main()

{

  printf("hello world!\n");

  return 0;

}

先使用 gcc -o hello_x86 hello.c 編譯生成hello_x86文件

再使用arm-linux-gcc -o hello_arm hello.c -static 編譯生成hello_arm文件 (注意這邊要加個-static 靜態鏈接,如果不加,默認動態鏈接,拷貝到開發板會出錯,可能是由於編譯器的版本和編譯內核的版本不一致造成的,Google、百度了一天也沒結果。)

編譯完畢后,可以看到生成的hello_arm和hello_x86文件,

./hello_x86 執行結果為:hello world!

./hello_arm 執行結果為:無法打開二進制文件

使用file命令查看:file hello_arm 它會告訴你只能在arm體系結構下運行。 

剩下的就是把hello_arm拷貝到arm架構的開發板上去,看看運行結果是不是hello world!

 


免責聲明!

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



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