了解了之前的交叉編譯器的命名規則后,也就明白了交叉編譯,針對不同架構,平台,目標系統等的區別。
而對於嵌入式開發,想要獲得,針對我們所需要的,目標的CPU所合適的交叉編譯器,就成了接下來,順其自然要考慮的事情。
想要得到,可用的,針對自己的CPU的交叉編譯器,主要有兩種方式:
難度等級:1級
這個沒有啥特殊要求解釋的,就是,網上,總會有,免費的,好用的各種資源的。
其中就包括,別人,已經針對某些CPU,某些平台,編譯好了交叉編譯器了
而你要做的事情就是:找到合適的,並下載下來使用。
關於網上,現存的,可用的,針對arm的交叉編譯器,可以參考我之前整理的一些:
![]() |
常見的,獲得交叉編譯器的方式 |
---|---|
其實,相對比較常見的,獲得可用的,交叉編譯器的方式是: 當你購買某一家的(嵌入式)開發板的時候,然后開發板廠家,提供你對應的硬件開發板的同時,也提供對應的整套開發軟件。 此處,整套的開發軟件,其中就包括,對應的,用來編譯其廠家提供的BSP的軟件源碼的,交叉編譯器。 即:一般來說,你買了某家的某款的嵌入式開發板的時候,就送了對應的交叉編譯器 例 3.5. 購買了TQ2440的開發板,就送了對應的交叉編譯器 拿我之前,購買的TQ2440的開發板為例 買了TQ2440的開發板的時候,就送了對應的光盤了。 光盤里面,就包含了對應的各種開發資料和交叉編譯器 其實,對於交叉編譯器本身,TQ2440的廠家,叫做天嵌公司,其本身有自己的論壇,論壇里面,也可以免費下載到對應的交叉編譯器的 [光盤下載] 2010年6月 最新TQ2440光盤下載 (Linux內核,WinCE的eboot,uboot均有更新)
|
如果網上沒有合適的交叉編譯器,那么就需要你手動去制作了。
自己手動制作交叉編譯器,又分兩種:
難度等級:6級
相關舊帖:【整理】交叉編譯和現存的交叉編譯工具
對於,制作交叉編譯器這樣的事情,本身是很需要技術含量,和很耗時的事情
所以,對此,現在現存很多相關的工具,以簡化制作交叉編譯器這個事情的復雜度,幫你節省很多精力和時間
而你所要做的事情就只是:
了解有哪些工具,選個合適的工具,搞懂如何使用,用其制作出你所需要的交叉編譯器,即可。
關於現在有哪些交叉編譯器的制作工具,正是下文正要詳細解釋的:
下面,就針對,現存已知的,交叉編譯器,的制作工具,進行簡單的總結和介紹:
Buildroot主頁:http://www.buildroot.net/
特點:不僅能制作交叉工具鏈,而且還可以制作根文件系統rootfs。而且還支持同時編譯對應的Linux內核和Uboot。
關於Buildroot的更多介紹和使用,可以參考我的另外一個教程:
現在用的最多的是那個0.43的版本:
也可以去在線瀏覽對應的源碼:在線瀏覽crosstool-0.43源碼
http://www.denx.de/wiki/DULG/ELDK
也是和交叉編譯相關的。
提供編譯好的東西供使用。
可以去這里:
http://www.denx.de/wiki/view/DULG/ELDKAvailability
去下載。
OpenEmbedded是一個創建嵌入式Linux的整套框架,其中包括了制作對應的交叉編譯器的工具,叫做BitBake
OpenEmbedded簡稱OE。
OpenEmbedded主頁:http://www.openembedded.org/wiki/Main_Page
OpenEmbedded的在線文檔:OpenEmbedded User Manual
關於BitBake可去參考:
http://en.wikipedia.org/wiki/BitBake
中的:
后來在:
http://ymorin.is-a-geek.org/projects/crosstool
中發現作者ymorin之前的一些會議演講:
http://crosstool-ng.org/publis/
等內容,比如:
200910-ELCE-Morin-Building_our_own_toolchains.pdf
其中,對於下載別人已有的交叉編譯器和自己手動編譯一個交叉編譯器之間,做了些對比,分析了各自的優缺點。
個人覺得其說的比較全面,特此整理如下:
- 安裝和使用都很方便
別人發布的,已經編譯好的交叉編譯器,基本都是壓縮包
然后你解壓后,即可得到對應的,可用的,交叉編譯器
其效果,類似於,之前自己編譯出來的交叉編譯器,有對應的交叉編譯版本的gcc,ld等等程序,即:
arm-xscale-linux-gnueabi-gcc
arm-xscale-linux-gnueabi-ld
等等文件的了。
比如:
【記錄】Ubuntu下用crosstool-ng為xscale建立交叉編譯器arm-xscale-linux-gnueabi-gcc
中的:
crifan@ubuntu:~/develop/crosstool-ng/crosstool-ng-1.18.0_build$ ls /home/crifan/develop/crosstool-ng/x-tools/arm-xscale-linux-gnueabi/bin -lh total 18M -r-xr-xr-x 1 crifan crifan 605K Aug 8 01:10 arm-xscale-linux-gnueabi-addr2line -r-xr-xr-x 2 crifan crifan 633K Aug 8 01:10 arm-xscale-linux-gnueabi-ar -r-xr-xr-x 2 crifan crifan 1.1M Aug 8 01:10 arm-xscale-linux-gnueabi-as -r-xr-xr-x 2 crifan crifan 276K Aug 8 01:10 arm-xscale-linux-gnueabi-c++ lrwxrwxrwx 1 crifan crifan 28 Aug 8 00:54 arm-xscale-linux-gnueabi-cc -> arm-xscale-linux-gnueabi-gcc -r-xr-xr-x 1 crifan crifan 605K Aug 8 01:10 arm-xscale-linux-gnueabi-c++filt -r-xr-xr-x 1 crifan crifan 276K Aug 8 01:10 arm-xscale-linux-gnueabi-cpp -r-xr-xr-x 1 crifan crifan 3.1K Aug 7 23:57 arm-xscale-linux-gnueabi-ct-ng.config -r-xr-xr-x 1 crifan crifan 26K Aug 8 01:10 arm-xscale-linux-gnueabi-elfedit -r-xr-xr-x 2 crifan crifan 276K Aug 8 01:10 arm-xscale-linux-gnueabi-g++ -r-xr-xr-x 2 crifan crifan 272K Aug 8 01:10 arm-xscale-linux-gnueabi-gcc -r-xr-xr-x 2 crifan crifan 272K Aug 8 01:10 arm-xscale-linux-gnueabi-gcc-4.6.0 -r-xr-xr-x 1 crifan crifan 30K Aug 8 01:10 arm-xscale-linux-gnueabi-gcov -r-xr-xr-x 1 crifan crifan 2.7M Aug 8 01:10 arm-xscale-linux-gnueabi-gdb -r-xr-xr-x 1 crifan crifan 2.7M Aug 8 01:10 arm-xscale-linux-gnueabi-gdbtui -r-xr-xr-x 1 crifan crifan 670K Aug 8 01:10 arm-xscale-linux-gnueabi-gprof -r-xr-xr-x 4 crifan crifan 1.1M Aug 8 01:10 arm-xscale-linux-gnueabi-ld -r-xr-xr-x 4 crifan crifan 1.1M Aug 8 01:10 arm-xscale-linux-gnueabi-ld.bfd -r-xr-xr-x 1 crifan crifan 11K Aug 8 01:10 arm-xscale-linux-gnueabi-ldd -r-xr-xr-x 2 crifan crifan 617K Aug 8 01:10 arm-xscale-linux-gnueabi-nm -r-xr-xr-x 2 crifan crifan 775K Aug 8 01:10 arm-xscale-linux-gnueabi-objcopy -r-xr-xr-x 2 crifan crifan 943K Aug 8 01:10 arm-xscale-linux-gnueabi-objdump -r-xr-xr-x 1 crifan crifan 11K Aug 8 01:10 arm-xscale-linux-gnueabi-populate -r-xr-xr-x 2 crifan crifan 633K Aug 8 01:10 arm-xscale-linux-gnueabi-ranlib -r-xr-xr-x 1 crifan crifan 317K Aug 8 01:10 arm-xscale-linux-gnueabi-readelf -r-xr-xr-x 1 crifan crifan 609K Aug 8 01:10 arm-xscale-linux-gnueabi-size -r-xr-xr-x 1 crifan crifan 605K Aug 8 01:10 arm-xscale-linux-gnueabi-strings -r-xr-xr-x 2 crifan crifan 775K Aug 8 01:10 arm-xscale-linux-gnueabi-strip crifan@ubuntu:~/develop/crosstool-ng/crosstool-ng-1.18.0_build$
然后,你把包含了上述arm-xscale-linux-gnueabi-gcc等文件的路徑,加到環境變量PATH中,然后就可以使用了。
- 已驗證和測試
別人發布的,交叉編譯器,一般都是,經過相應的驗證和測試
保證了,可以使用,不會出問題的。
所以,你可以放心使用,不會擔心,出現編譯程序出錯的時候,確保不會是由於交叉編譯器問題。
- 已優化
別人發布的交叉編譯器,一般都是經過,在制作的時候,加了一些優化參數
使得針對某些方面,比如性能等等,做了相應的優化
使得,交叉編譯器編譯出來的程序,對於目標的CPU,是相對最優的
- (售后)支持比較好
就像你買東西,很多時候,不出問題的時候,售后,看不出有啥用
但是當出問題,就發現,售后其實很重要
而搞嵌入式開發,尤其是交叉編譯
很多時候,涉及到很多技術細節
有時候遇到問題的話,如果你不熟悉,不了解,不會解決
這時候,去找到,交叉編譯器的提供者,去咨詢
對於你來說,就顯得很有價值,很重要了。
別人提供的交叉編譯器的話,往往都是提供后續的技術支持的
對於多數的開發者,這點,還是有價值的
參考:http://www.cnblogs.com/esion/archive/2012/08/28/2660033.html,其實是可以安裝后,設置好環境變量,之后就可以一直不變的去使用的。
http://www.myir-tech.com/download.asp中提供了很多東西下載,包括工具鏈。
http://www.denx.de/en/News/WebHome
-> ftp://ftp.denx.de/pub/eldk/5.3/
-> ftp://ftp.denx.de/pub/eldk/5.3/iso/
中有各種的,基於arm的eldk,比如:
- eldk-5.3-armv4t.iso
- eldk-5.3-armv5te.iso
- eldk-5.3-armv6.iso
- eldk-5.3-armv6.iso
- eldk-5.3-armv7a-hf.iso
- eldk-5.3-armv7a.iso
貌似是下載下來,解壓后,去運行安裝腳本后,就可以使用了。
- 無針對你自己的CPU的優化
別人提供的,已有的交叉編譯器,相對來說,更多時候,都是針對某個系列的CPU,進行制作出來的,進行優化的
即,其優化,也是相對比較通用的
如果你的CPU和其不同,則其就沒有對應的優化了
- 專有化
和上面有點類似,即沒有針對你自己的CPU,進行優化
- 太老,太舊
別人給的,網上可以下載到的,很多交叉編譯器,相對來說,版本都比較舊了,都是很老的,之前的了
其所用的,其他各個組件,模塊,也都是舊版本的
舊的軟件,對於新出來的CPU,新的功能等,自然沒有對應的支持
也就無法發揮新的硬件特性了了
- 其所用的源碼不清楚
別人給你編譯好的交叉編譯器,你是可以用了
但是,其針對於具體什么版本的源碼,以及是否打了相應補丁等情況
你是無法,也很難知道的
所以,即無法掌控此已有交叉編譯器的所用的源碼的確切情況
此點,針對於你對自己的CPU很熟悉的情況下,想要完全了解已有交叉編譯器的背后的情況而言,算是個缺點
即不能完全在你掌握范圍內,不清楚后面的情況
- 未必適合你的系統
或許是不可重載(relocatable)的
沒有很方便的方式去獲得一些系統庫文件
所以,未必真正適合你自己的,嵌入式系統環境
- 自定義各種組件及版本
對於自己去制作交叉編譯器的話,則其所用的各種組件,模塊的版本,都可以自己選擇和定制
- 針對你自己的CPU進行特定的優化
- 對於各種補丁包,已經很清楚了
既然是自己制作交叉編譯器,那么自然選擇了,相對較新的源碼包,以及各種模塊
其自然,已經現存有很多補丁包
這些補丁包,修復了很多bug,或者是增加了很多新的功能支持等
這時候,你就可以找到並打上這些補丁包
以實現,修復該模塊的已知的bug,增加新的功能的支持了
- Same source for all targets
暫未搞懂此點的確切含義。
- 可以同步更新最新補丁
相應的,如果有最新的補丁,也可以及時打上
- 可重復
對於自己制作交叉編譯器的話,
制作完成后,就確定了對應的各個模塊的版本,有了對應的配置文件
此配置,拿到別的地方,別人用同樣的工具和類似的環境,是可以重新編譯為其自己的
即,所謂的可重復,別人可以利用你已經驗證,可以正常制作和使用的各個版本的模塊和配置,實現自己也制作一個屬於自己的交叉編譯器
- 有社區支持
當然,對應的,在制作交叉編譯器期間,使用交叉編譯器期間,
出了問題,有任何疑問,都有對應的社區的,熱心人,幫你解決,回答你的問題。
- 適合你自己的系統
如前所述,拿別人已制作好的交叉編譯器,未必真正完全適合你自己的系統
而如果你自己制作的話,當然就完全根據自己的需求,去制作出最適合自己的系統的交叉編譯器了
- 制作交叉編譯器相對比較復雜
制作交叉編譯器,相對來說,是個技術活加體力活
不僅僅要求有對應的知識背景,解決各種問題的能力,
還要准備一定的時間和精力,去真正實現,真正去建立出來一個可用的交叉編譯器
- 可能存在的,對於你的處理器支持度不是足夠好
既然制作交叉編譯器期間,可能需要打上很多的patch等等
那也就存在,比如缺少了對應的補丁,補丁不太完整,補丁不合適等等特殊情況
使得,對於對應的,有些處理器,支持度,不是很好
- 驗證
在制作出了交叉編譯器后,其實還需要一定的驗證,保證其可用,好用。
這也需要對應的技術能力,和精力,去實現。
- 社區的支持
對於社區的支持,有其之前所說的優點,那就是,社區活躍的話,可能解決問題的效率就相對較高
但是當社區不夠活躍,社區中沒有合適的人,那么可能你的問題,就很難得到解決
即,有問題的時候,依靠社區去解決,未必是完全靠譜的。
[1] GNU Binutils
[12] 【整理】交叉編譯和現存的交叉編譯工具
[15] 嵌入式開發之交叉編譯器
[19] [整理]EABI和OABI
[22] crosstool-ng詳解
[23] Buildroot詳解
[25] 【整理】交叉編譯心得和注意事項