[轉]什么是交叉編譯,為什么要使用交叉編譯?


一、什么是交叉編譯

在一種計算機環境中運行的編譯程序,能編譯出在另外一種環境下運行的代碼,我們就稱這種編譯器支持交叉編譯。這個編譯過程就叫交叉編譯。

簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。

這里需要注意的是所謂平台,實際上包含兩個概念:體系結構(Architecture)、操作系統(OperatingSystem)。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 Linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。

交叉編譯這個概念的出現和流行是和嵌入式系統(Embedded Systems)的廣泛發展同步的。

我們常用的計算機軟件,都需要通過編譯的方式,把使用高級計算機語言編寫的代碼(比如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的可執行代碼。

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

有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特征;

有時是因為目的平台上的資源貧乏,無法運行我們所需要編譯器;

有時又是因為目的平台還沒有建立,連操作系統都沒有,根本談不上運行什么編譯器。

三、本地編譯和交叉編譯的比較

本地編譯:本地編譯可以理解為,在當前編譯平台下,編譯出來的程序只能放到當前平台下運行。平時我們常見的軟件開發,都是屬於本地編譯。比如,我們在 x86 平台上,編寫程序並編譯成可執行程序。這種方式下,我們使用 x86 平台上的工具,開發針對 x86 平台本身的可執行程序,這個編譯過程稱為本地編譯。

交叉編譯:交叉編譯可以理解為,在當前編譯平台下,編譯出來的程序能運行在體系結構不同的另一種目標平台(該平台自己不能干,所以讓其它平台來干)上,但是編譯平台本身卻不能運行該程序。比如,我們在 x86 平台上,編寫程序並編譯成能運行在 ARM 平台的程序,編譯得到的程序在 x86 平台上是不能運行的,必須放到 ARM 平台上才能運行。


免責聲明!

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



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