(一)交叉編譯器簡介

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

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

(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等。

Linux-C語言學習交流【721709245】在學的進群一起交流,資料自己群檔案下載

相關資料: