1. 程式人生 > >什麼是交叉編譯,為什麼要使用交叉編譯?

什麼是交叉編譯,為什麼要使用交叉編譯?

一、什麼是交叉編譯

       在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的程式碼,我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在一個平臺上生成另一個平臺上的可執行程式碼。這裡需要注意的是所謂平臺,實際上包含兩個概念:體系結構(Architecture)、操作系統(OperatingSystem)。同一個體系結構可以執行不同的作業系統;同樣,同一個作業系統也可以在不同的體系結構上執行。舉例來說,我們常說的x86Linux平臺實際上是Intel x86體系結構和Linux for x86作業系統的統稱;而x86 WinNT平臺實際上是Intel x86體系結構和Windows NT for x86作業系統的簡稱。

      交叉編譯這個概念的出現和流行是和嵌入式系統的廣泛發展同步的。我們常用的計算機軟體,都需要通過編譯的方式,把使用高階計算機語言編寫的程式碼(比如C程式碼)編譯(compile)成計算機可以識別和執行的二進位制程式碼。比如,我們在Windows平臺上,可使用Visual C++開發環境,編寫程式並編譯成可執行程式。這種方式下,我們使用PC平臺上的Windows工具開發針對Windows本身的可執行程式,這種編譯過程稱為native compilation,中文可理解為本機編譯。然而,在進行嵌入式系統的開發時,執行程式的目標平臺通常具有有限的儲存空間和運算能力,比如常見的ARM 平臺,其一般的靜態儲存空間大概是16到32MB,而CPU的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilation tool chain)需要很大的儲存空間,並需要很強的CPU運算能力。為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、儲存控制元件足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執行程式。

      要進行交叉編譯,我們需要在主機平臺上安裝對應的交叉編譯工具鏈(crosscompilation tool chain),然後用這個交叉編譯工具鏈編譯我們的原始碼,最終生成可在目標平臺上執行的程式碼。常見的交叉編譯例子如下:
 
1、在Windows PC上,利用ADS(ARM 開發環境),使用armcc編譯器,則可編譯出針對ARM CPU的可執行程式碼。
 
2、在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平臺的可執行程式碼。
 
3、在Windows PC上,利用cygwin環境,執行arm-elf-gcc編譯器,可編譯出針對ARM CPU的可執行程式碼。

二、為什麼要使用交叉編譯

有時是因為目的平臺上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特徵;有時是因為目的平臺上的資源貧乏,無法執行我們所需要編譯器;有時又是因為目的平臺還沒有建立,連作業系統都沒有,根本談不上執行什麼編譯器。