什麼是交叉編譯?

2021-05-12 09:17:21 字數 3017 閱讀 2632

在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的**,我們就稱這種編譯器

支援交叉編譯。這個編譯過程就叫交叉編譯

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

**。這裡需要注意的是所謂平台,實際上包含兩個概念:體系結構(architecture)、作業系統 (operating system)。同乙個體系結構可以執行不同的作業系統;同樣,同乙個作業系統也可以在不同的體系結構

上執行。舉例來說,我們常說的x86 linux平台實際上是intel x86體系結構和linux for x86作業系統的統稱;

而x86 winnt平台實際上是intel x86體系結構和windows nt for x86作業系統的簡稱。有時是因為目的平台

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

上的資源貧乏,無法執行我們所需要編譯器;有時又是因為目的平台還沒有建立,連作業系統都沒有,

根本談不上執行什麼編譯器。交叉編譯這個概念的出現和流行是和嵌入式系統的廣泛發展同步的。我們

常用的計算機軟體,都需要通過編譯的方式,把使用高階計算機語言編寫的**(比如c**)編譯成

計算機可以識別和執行的二進位制**。比如,我們在windows平台上,可使用visual c++開發環境,編寫

程式並編譯成可執行程式。這種方式下,我們使用pc平台上的windows工具開發針對windows本身的可

執行程式,這種編譯過程稱為native compilation,中文可理解為本機編譯。然而,在進行嵌入式系統的

開發時,執行程式的目標平台通常具有有限的儲存空間和運算能力,比如常見的 arm 平台,其一般的靜

態儲存空間大概是16到32mb,而cpu的主頻大概在100mhz到500mhz之間。這種情況下,在arm平台

上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilation tool chain)需要很大的儲存空

間,並需要很強的cpu運算能力。為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,

我們就可以在cpu能力很強、儲存控制項足夠的主機平台上(比如pc上)編譯出針對其他平台的可執行程

序。 要進行交叉編譯,我們需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain),

然後用這個交叉編譯工具鏈編譯我們的源**,最終生成可在目標平台上執行的**。常見的交叉編譯

例子如下:

在windows pc上,利用ads(arm 開發環境),使用armcc編譯器,則可編譯出針對arm cpu的 可執行**。

在linux pc上,利用arm-linux-gcc編譯器,可編譯出針對linux arm平台的可執行**。

在windows pc上,利用cygwin環境,執行arm-elf-gcc編譯器,可編譯出針對arm cpu的可執行**。

ok,這裡來到了重點。我們知道了什麼是交叉編譯環境,那我們到底應該怎麼開始呢?

網上有很多建立交叉編譯環境的傻瓜教程,比如:

ibm的《如何為嵌入式開發建立交叉編譯環境 》

huihoo的

一步一步的製作arm-linux交叉編譯環境

一般我們編譯程式和編譯器的版本沒有關係,不乏特殊情況,比如在移植qtopia4.x.x的時候,官方文件

就要求使用3.2.x以上的編譯器。另外,如果編譯過程中遇到了很奇怪的問題無法解決時,可以考慮換乙個編

譯器版本試試。

下面我們以arm-linux-gcc-3.4.1為例介紹交叉編譯環境的建立。

建議不要使用tar的"v"引數,如果解壓的檔案比較大的話,使用"v"引數與不使用這個引數的解壓速度有很大區別。

$ mv usr/local/arm ./

$ ls usr/local/arm/3.4.1/bin/

arm-linux-addr2line  arm-linux-cpp        arm-linux-gcov     arm-linux-ranlib

arm-linux-ar         arm-linux-g++        arm-linux-ld       arm-linux-readelf

arm-linux-as         arm-linux-gcc        arm-linux-nm       arm-linux-size

arm-linux-c++        arm-linux-gcc-3.4.1  arm-linux-objcopy  arm-linux-strings

arm-linux-c++filt    arm-linux-gccbug     arm-linux-objdump  arm-linux-strip

為了方便,我們需要把這個資料夾加到系統變數`path`裡面,這樣我們就可以像使用系統變數一樣使用

這些命令了。編輯`~/.bashrc`,這個檔案是隱藏檔案,當使用者登入時就會首先執行這個檔案,因此我們

可以把設定環境變數的命令寫進去。

$ echo "export path=$path:/usr/local/arm/3.4.1/bin" >> ~/.bashrc

$ source ~/.bashrc

到此為止,我們的交叉編譯器就算搞定了,是不是不是想象中的那麼難?^_^

建立日期:  2009-5-17

*** 於 *** 修改

(修改者請在此處按以上格式新增資訊)

author:

rjzemail :

[email protected]

長大-linuxers

什麼是交叉編譯?

ok,這裡來到了重點。我們知道了什麼是交叉編譯環境,那我們到底應該怎麼開始呢?網上有很多建立交叉編譯環境的傻瓜教程,比如 ibm的 如何為嵌入式開發建立交叉編譯環境 huihoo的 一步一步的製作arm linux交叉編譯環境 有幾款公認的比較穩定的版本 一般我們編譯程式和編譯器的版本沒有關係,不乏...

什麼是交叉編譯

交叉編譯的概念是隨著嵌入式系統的發展進化出來的。我們平常接觸到的桌面應用軟體一般是在桌面整合開發環境,比如visual c 中編寫 通過編譯生成可執行程式。桌面軟體開發一般是在a類機器 linux windows 開發 編寫源 編譯得到可執行檔案 然後在a類機器執行,這是非嵌入式開發模式。嵌入式開發...

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

一 什麼是交叉編譯 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的 我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在乙個平台上生成另乙個平台上的可執行 這裡需要注意的是所謂平台,實際上包含兩個概念 體系結構 architecture 作業系統 operat...