何爲交叉編譯?
所謂交叉編譯簡單的說,就是在一個平臺上編譯出在另一個在平臺能跑的可執行程序。比如,本文的情況是,在windows上編譯出在樹莓派上能跑的可執行程序。(其中,windows是運行在x86的cpu上,而樹莓派是arm的cpu。)
樹莓派上已經有gcc了,爲什麼還要用交叉編譯這種方式呢?
因爲,樹莓派的運行速度是比較慢的,而我們的PC機運行速度比較快,如果編譯都在樹莓派上做,那麼就只有慢慢等了。
教程目標:
在windows平臺上,搭建出樹莓派的交叉編譯環境
教程器材及軟件:
- 樹莓派的板子。
- SD卡(已經有鏡像刷入)。
- 電源線及USB充電器。
- cygwin。
- 有DHCP的網線。
步驟:
cygwin:
- 下載cygwin(http://www.cygwin.com/)。
- 安裝cygwin,途中需要看看,稍作選擇。(其中,源選擇163的可能會快一些。)
- 其中要特別選擇一下ssh,還有mintty,以便之後要用。其他就默認吧。當然,如果漏過了什麼也可以重新打開這個程序,選擇想要的,再安裝一遍。
- 這樣裝完了可能會出現一個錯誤,叫pango1.0.sh exit code 1之類的,那麼你需要進入到c:\cygwin\etc下面建一個文件夾叫pango,然後再執行一遍上面的過程,應該就沒事了。(這就是個bug,pango他們已經在改了)這樣裝完了,其實默認的gcc等一系列的東西是沒有,如果想要可以回去再選擇再安裝。
arm tool-chain:
- 到https://github.com/IanLinsdell/Raspberrypi去下載編譯好的工具鏈。其實是可以在cygwin中編譯出工具鏈的,但是,聽同學說,他在linux上花了2個小時和4G+硬盤空間去編譯,那還不如下一個現成的。
- 下載後,解開壓縮,有兩個選擇一個是hardfp,另一個是softfp。(目前,我也不知道有什麼區別。我用的是hardfp,之後試了一下浮點好像沒有問題。)將你的選擇解壓縮後放到cygwin下面,形成這樣的目錄結構。c:\cygwin\opt\cross\x-tools\arm-unknown-linux-gnueabi。並在環境變量PATH中加入,c:\cygwin\opt\cross\x-tools\bin\
測試:
- 打開mintty,建一個hello.cpp,然後,寫一個經典的helloworld,之後編譯一下
如果,好運的話,沒有什麼錯誤。(我之前嘗試其他編譯出來的工具鏈,不斷地出錯。)arm-unknown-linux-gnueabi-g++ hello.cpp
- 用sftp命令將a.out上傳到樹莓派上,然後用ssh登錄後運行它。
後記:
在這過程中,不斷地出錯,不斷地上網去查,也不知道參考了多少。不能像linux下一樣,有比較多的教程,剩下的只是等待的時間。也發現了許多開源軟件的bug和問題,令人十分煩惱,比如下面這個。
但不管怎麼樣,我還是得感謝開源,感謝爲開源做出貢獻的人,感謝那些在網上分享出自己的知識的人。
參考:
http://www.a2p.it/wordpress/tech-stuff/development/remote-debugging-raspberrypi/
備註:
此教程爲浙江大學計算機學院嵌入式課程的實驗二實驗報告。