交叉編譯完全解決方案

2021-08-24 19:41:26 字數 1533 閱讀 4031

[注:本文僅適用於嵌入式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請看:

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

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

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

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

在目標平台上直接進行本地編譯,在速度上比較慢,而且有些檔案的編譯需要耗費很多記憶體,例如ruby1.9的parser.c檔案在64m記憶體的平台上就無法編譯。這個時候就需要開啟swap才行。

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

enjoy it  :-)

CSS居中完全解決方案

把行內元素巢狀在乙個div中,並且在div中設定以下樣式 a 對於定寬的塊級元素,我們要設定起margin top,margin right 為auto center 多個塊級元素,我們將其display設定為inline block 然後將父級元素設定一下屬性 div 設定需要水平居中的塊狀元素的...

Jmail c 傳送郵件完全解決方案

清單 using jmail using system.net email 的摘要說明 public class email 傳送郵件 沒有抄送人 接收郵件名 發件人姓名 郵件標題 郵件內容 public static bool sendmail string usermail,string use...

SSO 單點登入完全解決方案 參考

2007年8月6日 11 49 03 發布 yaosansi sso 單點登入完全解決方案單點登入解決方案 sso解決方案 單點登入,跨域訪問,單點登陸,使用者跨域,跨域登入,跨域登陸解決方案 伺服器端可控情形js跨域訪問解決方法 單點登入的簡單實現 php實現webservices和跨域自動登陸 ...