交叉編譯完全解決方案

[注:本文僅適用於嵌入式Linux系統]


背景

 

嵌入式系統開發的頭疼問題之一就是交叉編譯。

 

什麼是交叉編譯?簡單的說,就是程序的目標運行平臺與編譯這個程序所在的平臺不一樣,這樣的編譯方法就是交叉編譯。在交叉編譯一個軟件包的時候,要適當的配置build, host和target參數。

 

什麼是build, host和target ?

 

build:  就是你進行編譯的平臺,也就是運行交叉編譯器的平臺。這個一般不用指定,configure腳本會自動檢測。

host:  就是你的交叉編譯器所使用的庫的目標平臺。一般情況下,這個就是你的目標程序的運行環境。

target: 就是你的目標程序的運行平臺。

 

絕大多數情況下,host和target是一致的。很多時候只需要配置host即可,configure會根據你的host來推測target。

 

基本方法

 

瞭解交叉編譯的基本知識以後,就可以用基本方法來進行交叉編譯。關於交叉編譯的基本方法,見:嵌入式Linux下常用的交叉編譯方法

 

虛擬方法

 

虛擬方法是指利用qemu這樣的虛擬工具來部分模擬目標環境,配合交叉編譯器來進行交叉編譯。目前只有scratchbox是使用這樣的技術。

 

隨着maemo的熱度上升,scratchbox也得以迅速發展,sb1相當穩定,sb2也已經非常可用了。

 

利用虛擬機來仿真運行可以解決大部分的在交叉編譯過程中遇到的問題,但是還是會遇到問題。例如有些庫在編譯過程中通過/proc/cpuinfo檢測CPU所支持的指令以進行特別優化,或者碰到sb2沒有截獲的路徑映射,就會連接到錯誤的庫,還有qemu-arm的透明仿真模式容易陷入死循環。例如,在sb2中編譯ruby1.9.1就會陷入死循環而編譯不過。碰到一些更復雜的,如編譯ruby的c擴展,安裝需要及時編譯的gem,這個時候scratchbox就招架不住了。

 

 

終極方法

 

終極的交叉編譯方法就是不交叉編譯。

 

在你的目標平臺上安裝debian,然後就可以進行本地編譯。

 

在arm平臺上安裝debian請看:http://wiki.debian.org/ArmEabiHowto

 

最新的lenny已經採用了eabi,效率提升並且允許混合使用軟/硬浮點庫,對於算法類型的應用真是福音!

 

要安裝lenny debian-eabi大約需要160M的存儲空間。

 

要是你的平臺沒有這麼大的存儲空間也沒關係,用nfs就可以了。

 

要是連網絡連接也不具備怎麼辦? 如果是這樣,那就只好又藉助qemu了。可以在qemu中安裝debian,進行編譯,最後把編譯後的目標文件拷貝出來就可以了。不過這樣你需要看一下你的平臺qemu是否支持,以及你要提供一個於你平臺最接近的內核。

 

在目標平臺上直接進行本地編譯,在速度上比較慢,而且有些文件的編譯需要耗費很多內存,例如ruby1.9的parser.c文件在64M內存的平臺上就無法編譯。這個時候就需要打開swap纔行。

 

 

一個參考數據: ARM9 (v5TEJ), 98BogoMIPS,64M RAM, 編譯ruby1.8.7 需要110分鐘左右。

 

除了速度比較慢以外,這是個終極解決方案,可以解決所有的交叉編譯煩惱

 

Enjoy it  :-)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章