作者:華清遠見講師
編譯器:
就是将"一種語言(通常為進階語言)"翻譯為"另一種語言(通常為低級語言)"的程式。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目标代碼 (object code) → 連結器 (Linker) → 可執行程式 (executables) 。
一:什麼叫交叉編譯器呢?
在解釋什麼叫交叉編譯器前,我們必須要知道“本地編譯”這個概念,在我們之前學習過得軟體開發中,都屬于本地編譯,換而言之就是在x86平台下,直接将源檔案編譯出來的程式,編譯出來的程式可以在目前平台下進行運作。在了解這個概念的前提下,我們接下來再來學習什麼叫交叉編譯器。
而所謂的交叉編譯器,其實也很簡單,就是在一種平台上編譯出來的程式,不在是放在自己的機器上去運作,而是放到另外一個平台上去運作,也就是我們所說的環境不一樣,而這也就是為什麼稱之為交叉編譯器的原因,用英文解釋,這就是所謂的cross。
二:體系結構與作業系統
1,常見的體系結構有ARM結構、x86結構等.
2,常見的作業系統有linux,windows等.
3,同一個體系結構可以運作不同作業系統,如x86上可以運作Linux、Windows等,在ARM上可以運作Linux、WinCE.
4,同一個作業系統可以在不同的體系結構上運作,比如Linux可以運作在x86上,也可以運作在ARM上.
5.同樣的程式不可能運作在多個平台上,比如Windows下應用程式不能在Linux下運作.如果一個應用程式想在另一個平台上運作,必須使用針對該平台的編譯器,來重新編譯該應用程式的二進制代碼,就像我們現在在身邊程序遇到的,如果你使用的是蘋果手機,下載下傳需要的app,會提醒你下載下傳适合蘋果版本的,而如果你使用的是,那你就要選擇androin的應用程式。
三:使用交叉編譯器的原因
ARM上可以運作作業系統,是以使用者完全可以将ARM當做計算機來使用,理論上也可以在ARM上使用本地的編譯器來編譯程式.但是,編譯器在編譯程式時,會産生大量的中間檔案,這會占用很大的記憶體和磁盤空間,且對CPU處理速度要求較高,比如S3C2440A記憶體、磁盤空間隻有幾十到100多兆,CPU隻有400-500MHz,完全達不到編譯程式的要求.是以,在進行ARM-linux嵌入式開發時必須在PC機(x86結構)上編譯出能夠運作在ARM上的程式,然後再将程式下載下傳到ARM中來運作.這就用到了交叉編譯器(當然我們也可以從我們簡答的認識下去認識為什麼使用交叉編譯器,在我們平時開發的過程中,我們最多的使用的還是基于x86的平台,确切的可以說就是我們的pc機,因為pc機相對我們的開發闆而言,資源是相對豐富的,我們可操作性較強)。
如果要進行交叉編譯,使用者需要在主機平台上安裝對應的交叉編譯工具鍊,然後才能使用去編譯源代碼,最終生成可在目标平台上運作的代碼.交叉編譯工具鍊可以從網上下載下傳,也可以自己制作.但編譯器不是萬能的,受版本限制,編譯某些程式時會報錯.常見的交叉編譯工具鍊有:
1,Cross -2.95.3 tar: 該版本較早,除了編譯vivi外一般不使用.
2,arm920t-eabi.tgz: 4.1.2版本的編譯器,支援eabi,可以編譯TX2440A開發闆上的所有程式.
3,arm-linux-gcc: 4.3.2版本的編譯器,支援eabi,是最常見的交叉工具鍊.
什麼是EABI
EABI,Embeded application binary interface,即嵌入式應用二進制接口,是描述可連接配接目标代碼、庫目标代碼、可執行檔案影像、如何連接配接、執行和調試以及目标代碼生成過程,和c, c++語言接口的規範,是編譯連接配接工具的基礎規範,也是研究它們工作原理的基礎.簡而言之,EABI就是一種編譯規範,交叉編譯器在編譯時,對于浮點運算會使用硬浮點運算,提高了浮點運算的性能,節省了編譯時間.
四:交叉編譯工具鍊執行個體
1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于編譯 ARM 架構的裸機系統(包括 ARM Linux 的 boot、kernel,不适用編譯 Linux 應用 Application),一般适合 ARM7、Cortex-M 和 Cortex-R 核心的晶片使用,是以不支援那些跟作業系統關系密切的函數,比如fork(2),他使用的是 newlib 這個專用于嵌入式系統的C庫。
2、arm-none-linux-gnueabi-gcc
(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)
主要用于基于ARM架構的Linux系統,可用于編譯 ARM 架構的 u-boot、Linux核心、linux應用等。arm-none-linux-gnueabi基于GCC,使用Glibc庫,經過 Codesourcery 公司優化過推出的編譯器。arm-none-linux-gnueabi-xxx 交叉編譯工具的浮點運算非常優秀。一般ARM9、ARM11、Cortex-A 核心,帶有 Linux 作業系統的會用到.
3、arm-eabi-gcc
Android ARM 編譯器
4、armcc
ARM 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程式(u-boot、kernel),但是不能編譯 Linux 應用程式。armcc一般和ARM開發工具一起,Keil MDK、ADS、RVDS和DS-5中的編譯器都是armcc,是以 armcc 編譯器都是收費的.
5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc.
arm-none-symbianelf 用于symbian,沒用過,不知道C庫是什麼 .
五:安裝交叉工具鍊執行個體
1,将arm-cortex_a8-linux-gnueabi.tar.bz2交叉編譯器壓縮包複制到虛拟機主目錄;
2,解壓arm-cortex_a8-linux-gnueabi.tar.bz2壓縮包;
tar xvf arm-cortex_a8-linux-gnueabi.tar.bz2
3,進入配置檔案修改環境變量;
sudo vi /etc/bash.bashrc
進入之後在最後一行添加如下代碼:
export PATH=$PATH:/home/fs/arm-cortex_a8/bin
注:fs為名叫fs的使用者
4,配置生效:
source /etc/bash.bashrc
5,測試:
在指令行輸入:
arm-c{TAB}(按TAB可以補全,說明交叉編譯器安裝成功)