交叉编译器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等.
頂總結
以上是生活随笔為你收集整理的交叉编译器arm-linux-gcc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php怎么做性格测试题目,PHP和原生J
- 下一篇: 最像XP的中文Linux,和XP一模一样