2012-06-10 123 views
51

TL/DR:我在哪裏可以找到關於爲ARM(gnueabi)平臺(打算在Raspberry Pi設備上運行)構建GCC 4.7.0交叉編譯工具鏈的更多信息?GCC中樹莓派的交叉編譯。從哪兒開始?

我剛買了一個全新的樹莓派,我非常渴望爲它開始編程。我設法安裝了GCC工具鏈(我正在使用Arch Linux系統映像)並編譯了一些基本程序,所有工作都很好。

我也試過編譯Boost庫,因爲我經常在我的項目中使用它們,並且按照說明(./bootstrap.sh + ./b2)似乎一切正常,除了編譯速度很慢。我將它擱置了幾個小時,但幾乎沒有超過前幾個源文件。在我離開它運行了一晚之後,我發現由於RAM短缺而中止了構建過程。

所以,我的猜測是,Rasp Pi只是編譯一些像Boost這樣大小的東西。所以,我認爲是交叉編譯。但是,儘管在線提供了大量有關ARM交叉編譯的信息,但我覺得它很讓人困惑。哪裏開始?

我在Raspberry Pi上有一個最新的GCC版本(4.7.0),所以我希望能夠使用相同的版本進行交叉編譯。我在哪裏可以獲得ARM的GCC 4.7.0工具鏈? (我將在x86的CentOS 6.2被編譯)

編輯:

我不需要釋放GPU內存,並設置了一個USB驅動器上的一個4GB的交換分區,同時建立文件上NFS共享。 Boost現在編譯的速度要快得多,因此它是可管理的。我仍然想知道如何在x86 PC上建立一個GCC 4.7工具鏈來進行交叉編譯,因爲我打算做大量的編譯工作,並希望它儘可能快。

編輯2:

由於GCC 4.7.0是相對較新的,似乎沒有成爲一個預先建立的交叉編譯器(i386-> ARM)。我可能必須自己創建一個,這似乎是一項不重要的任務(我已經嘗試並失敗了)。有沒有人知道一個教程要建立一個GCC交叉編譯器,希望爲最近的版本之一?

我試着this great shell script(這對於建立一個相同的拱編譯偉大的工作),我已經成功地建立binutils和GCC的先決條件,但隨後GCC編譯保持着許多神祕的錯誤失敗。我真的迷失在這裏,所以我會非常感謝你的幫助。上樹莓裨

GCC用

--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-bugurl=https://bugs.archlinux.org/ 
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared 
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-clocale=gnu 
--disable-libstdcxx-pch --enable-libstdcxx-time 
--enable-gnu-unique-object --enable-linker-build-id --with-ppl 
--enable-cloog-backend=isl --enable-lto --enable-gold 
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold 
--with-linker-hash-style=gnu --disable-multilib --disable-libssp 
--disable-build-with-cxx --disable-build-poststage1-with-cxx 
--enable-checking=release --host=arm-unknown-linux-gnueabi 
--build=arm-unknown-linux-gnueabi 

編輯3配置:

我設法建立使用this shell script爲ARM 4.7 GCC工具鏈(耶!)通過在用戶dwelch所建議註釋。我還使用this article作爲指導,建立了newliblibstdc++。工具鏈可以正常工作,但是如果我在Raspberry Pi上運行可執行文件,它會以Illegal instruction失敗。這可能是什麼原因?

+1

嘗試zram包,如果它尚未安裝。這將創建一個壓縮的RAM交換,這比你想象的更有幫助。 (太奇怪了。)還要添加一個非常快速的USB設備,無論是美元硬盤還是高質量的USB棒,並把交換。 –

+3

此外,在這個線程,你可以閱讀如何禁用圖形內存,所以你獲得32兆內存:http://www.raspberrypi.org/phpBB3/viewtopic.php?f=5&t=4831&p=65410 –

+1

哇,謝謝。我實際上已經爲GPU分配了128MB。難怪一切都如此緩慢。 – Tibor

回答

2

我找不到4.7 gcc,只有4.6。有關信息,我整理了郫縣的內核相當老的Ubuntu機(1GHz的768MB RAM)以下此頁面上的準則: Kernel compilation

構建了約90分鐘,而到6分,這是建議,將採取Pi。內核在Pi上運行良好。也許你可以修改這些指導原則來交叉編譯x86 Linux機器上的其他項目。

4

http://github.com/dwelch67/raspberrypibuildgcc directory有一個4.7 gcc/gnu和3.0 clang/llvm的腳本。從opencores的mpx項目的腳本中得到的gnu,我刪掉了gdb和libgcc,glibc等,把它放到了編譯器中。如果你想要其他的東西剪切和粘貼胳膊mips。

0

正如你所指出的,建立在Raspberry Pi本身上是緩慢的,但可靠的(因爲它不是交叉編譯),只要你沒有耗盡內存。也許可以調整內存和交換設置,使更大的版本成爲可能(如果不是很快)。我在論壇上了解到,人們正在討論將根分區放在標清,USB驅動器上的用戶分區上,當然,獲得快速(6級或更高級別)SD卡可能會有所幫助。隨着時間的推移,隨着軟件的改進,編譯性能可能會提高。或者,也許樹莓派2將有一個改進的芯片組和更多的內存。 :-)

+0

謝謝你的建議,但30分鐘的RPi與1分鐘我的筆記本電腦使得它在發展中非常不切實際,因爲我有很多重建工作要做。如果差異不那麼激烈,我肯定會在設備上構建。 – Tibor

+0

是的,我在同一條船上,在RPi上建造大約30分鐘。我將在Linux中開發(實際上是在Mac OS X上的Ubuntu VM),然後當我想對它進行測試時,就可以在RPi上進行構建。我希望這足以滿足我的目的(這是一個合理的設置),但如果沒有,我也會進行交叉編譯。 – mlepage

+0

我不知道我的Pi是不同的,但我從2012年開始有一個。它超頻到1000MHz。然而,它能夠編譯我最大的程序〜10K行的實際代碼(不是評論等)。取決於我是否刪除所有輸出對象,我的編譯時間大約爲30s到3分鐘。 我很少得到GCC段錯誤。但是,在編譯時間內調試和更改代碼真的很麻煩! 我用Ubuntu調試我的筆記本電腦上的所有程序,然後編譯它們爲Pi!完美的作品! – yash101

4

以下是一步一步的指導How to build Raspberry Pi cross-compiler in Windows。您得到Illegal Instruction錯誤的原因是最新的Raspbian已啓用hardfp,並且需要gcc和eglibc的相應補丁才能支持hardfp。否則,生成的代碼將使用不同的ABI,即不同的寄存器中的傳遞函數參數,因此會在運行時崩潰。

也錯誤配置GCC for ARMv7(Raspebby Pi是ARMv6)可能會導致Illegal Instruction錯誤。在配置GCC時一定要指定--with-arch=armv6選項。

上面鏈接的指南基於GCC 4.6.3。但我想它也適用於GCC 4.7。

1

dockcross project是完全除臭工具鏈的一個很好的起點,你不僅可以爲Pi創建,而且可以爲其他任何東西創建。這裏是命令:

docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7 
chmod +x ./dockcross-linux-armv7 
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm' 

它也有內置的cmake