在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的**,我們就稱這種編譯器
支援交叉編譯。這個編譯過程就叫交叉編譯
。簡單地說,就是在乙個平台上生成另乙個平台上的可執行
**。這裡需要注意的是所謂平台,實際上包含兩個概念:體系結構(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 :
長大-linuxers
什麼是交叉編譯?
ok,這裡來到了重點。我們知道了什麼是交叉編譯環境,那我們到底應該怎麼開始呢?網上有很多建立交叉編譯環境的傻瓜教程,比如 ibm的 如何為嵌入式開發建立交叉編譯環境 huihoo的 一步一步的製作arm linux交叉編譯環境 有幾款公認的比較穩定的版本 一般我們編譯程式和編譯器的版本沒有關係,不乏...
什麼是交叉編譯
交叉編譯的概念是隨著嵌入式系統的發展進化出來的。我們平常接觸到的桌面應用軟體一般是在桌面整合開發環境,比如visual c 中編寫 通過編譯生成可執行程式。桌面軟體開發一般是在a類機器 linux windows 開發 編寫源 編譯得到可執行檔案 然後在a類機器執行,這是非嵌入式開發模式。嵌入式開發...
什麼是交叉編譯,為什麼要使用交叉編譯
一 什麼是交叉編譯 在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的 我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在乙個平台上生成另乙個平台上的可執行 這裡需要注意的是所謂平台,實際上包含兩個概念 體系結構 architecture 作業系統 operat...