2012-06-10 23 views
51

TL/DR: Gdzie mogę znaleźć więcej informacji na temat budowania GCC 4.7.0 krzyżowego kompilacji toolchain dla ARM (gnueabi) platformy (przeznaczony do uruchomienia na urządzeniu Raspberry Pi)?Kompilacja krzyżowa dla Raspberry Pi w GCC. Gdzie zacząć?

Właśnie dostałem zupełnie nowy Raspberry Pi i jestem bardzo chętny do rozpoczęcia programowania dla niego. Udało mi się zainstalować toolchain GCC (używam obrazu systemu Arch Linux) i skompilowałem kilka podstawowych programów, wszystkie działają poprawnie.

Próbowałem również skompilować biblioteki Boost, bo często z nich korzystać w moich projektów i wszystko wydawało się działać prawidłowo, postępując zgodnie z instrukcjami (./bootstrap.sh + ./b2) z wyjątkiem faktu, że kompilacja boleśnie powolne. Zostawiłem to na kilka godzin, ale ledwo minęło kilka pierwszych plików źródłowych. Po tym, jak zostawiłem to działające na noc, odkryłem, że proces kompilacji został przerwany z powodu braku pamięci RAM.

Zgaduję więc, że Rasp Pi jest po prostu niedostatecznie wydajny do kompilowania czegoś o takim rozmiarze jak Boost. Więc myślę o krzyżowej kompilacji. Jednak mimo że istnieje wiele informacji na temat kompilacji krzyżowej ARM dostępnych online, uważam to za mylące. Gdzie się nawet zaczyna?

Mam najnowszą wersję GCC (4.7.0) dostępne na moim Raspberry Pi, więc chciałbym idealnie cross-kompilacji z tej samej wersji. Skąd mogę pobrać zestaw narzędzi GCC 4.7.0 dla ARM? (Będę na kompilacji x86 CentOS 6.2)

Edit:

I dealokowane niepotrzebne pamięci GPU i skonfigurować 4GB wymiany partycję na dysku USB, podczas gdy budują pliki są w udziale NFS. Funkcja Boost kompiluje się teraz znacznie szybciej, więc można nią zarządzać. Nadal chciałbym wiedzieć, jak mogę skonfigurować zestaw narzędzi GCC 4.7 do kompilacji krzyżowej na moim komputerze x86, ponieważ zamierzam dużo kompilować i chciałbym, aby był tak szybki, jak to tylko możliwe.

Edit 2:

Od GCC 4.7.0 jest stosunkowo nowy, nie wydaje się być gotowych cross-kompilator (i386-> ARM). Prawdopodobnie będę musiał sam je zbudować, co wydaje się nietrywialnym zadaniem (próbowałem i zawiodłem). Czy ktoś wie o tutorialu do naśladowania dla budowania cross-kompilatora GCC, mam nadzieję, że dla jednej z najnowszych wersji?

Próbowałem z this great shell script (który działał świetnie do budowy kompilator sam-arch), a ja z powodzeniem zbudowany binutils i GCC warunki, ale wtedy budować GCC przechowywane niepowodzeniem z wielu tajemniczych błędów. Naprawdę jestem tutaj zagubiony, więc bardzo bym wdzięczny za twoją pomoc.

GCC na Raspberry Pi został skonfigurowany z

--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 

Edit 3:

udało mi się zbudować toolchain 4,7 GCC dla ARM (yay!) Używając this shell script jak sugeruje dwelch użytkownika w komentarze. Zbudowałem też jako przewodnik newlib i libstdc++ przy użyciu this article. Toolchain działa dobrze, ale kiedy uruchamiam plik wykonywalny na moim Raspberry Pi, to kończy się niepowodzeniem z Illegal instruction. Co może być tego przyczyną?

+1

Wypróbuj pakiet zram, jeśli nie jest jeszcze zainstalowany. Spowoduje to utworzenie skompresowanej wymiany RAM, która pomoże ci więcej niż myślisz. (Dziwnie.) Dodaj też przyzwoicie szybkie urządzenie USB, albo dysk twardy USD, albo wysokiej jakości pamięć USB i włóż w to zamień. –

+3

Ponadto w tym wątku można przeczytać, jak wyłączyć pamięć graficzną, aby uzyskać 32 MB pamięci RAM: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=5&t=4831&p=65410 –

+1

Wow, dziękuję . Faktycznie miałem 128 MB przydzielone na GPU. Nic dziwnego, że wszystko było tak powolne. – Tibor

Odpowiedz

2

nie mogłem znaleźć gcc 4.7, tylko 4.6. Aby uzyskać więcej informacji, mam skompilowane jądro PI jest na dość starym komputerze Ubuntu (1GHz, 768MB RAM) zgodnie ze wskazówkami na tej stronie: Kernel compilation

Build trwało około 90 minut, w porównaniu do 6 godzin, to sugeruje się, że wziąłby na siebie Pi. Jądro działa dobrze na Pi. Być może będziesz mógł dostosować te wytyczne do krzyżowej kompilacji innych projektów na komputerze z systemem x86.

24

znalazłem te instrukcje How to build a cross compiler for your Raspberry Pi. Jest to świetny sposób na przejście przez użycie narzędzia crosstool-ng, które upraszcza konfigurację kompilatora cross-kompilatora A LOT (ma ładny interfejs oparty na curses) i obsługuje GCC 4.7.

się doskonale!

4

http://github.com/dwelch67/raspberrypibuildgcc directory Istnieje skrypt dla obu 4.7 gcc/gnu i 3.0 clang/llvm. gnu jeden pochodzi ze skryptu w projekcie mpx na opencores, wycinam gdb i libgcc, glibc, etc zabrałem go do kompilatora. jeśli chcesz, aby inne rzeczy cięły i wklejały ramię do mipów.

0

Jak już wspomniano, opierając się na Raspberry Pi sama jest powolny, ale wiarygodne (ponieważ nie jest cross-kompilacji), pod warunkiem, że nie zabraknie pamięci. Być może możliwe jest dostrojenie pamięci i zmiana ustawień, aby umożliwić większe kompilacje (jeśli nie szybkie). Wiem na forach, że ludzie mówią o umieszczaniu partycji root na SD, partycjach użytkowników na dyskach USB, i oczywiście prawdopodobnie zrobi to różnicę, aby uzyskać szybką (klasę 6 lub lepszą) kartę SD. Z biegiem czasu możliwe jest, że wydajność kompilacji poprawi się wraz z ulepszaniem oprogramowania. A może Raspberry Pi 2 będzie miał ulepszony chipset i więcej pamięci RAM. :-)

+0

Dziękuję za sugestię, ale 30 minut na RPI versus 1 minutę mój laptop sprawia, że ​​BARDZO niepraktyczny dla rozwoju, w którym mam wiele do zrobienia. Gdyby różnica nie była tak drastyczna, zdecydowanie budowałbym na urządzeniu. – Tibor

+0

Tak, jestem w tej samej łodzi, około 30 minut czasu budowy na RPi. Mam zamiar rozwinąć się w Linuksie (w rzeczywistości w systemie Ubuntu VM na Mac OS X), a następnie po prostu budować na RPi, kiedy chcę przetestować na nim. Mam nadzieję, że będzie to odpowiednie dla mojego celu (jest to rozsądna konfiguracja), ale jeśli nie, będę również tworzyć kompilacje. – mlepage

+0

Nie wiem, czy moje Pi jest inne, ale mam je od 2012 roku. Jest przetaktowany do 1000MHz. Jednak jest w stanie skompilować mój największy program ~ 10k linii rzeczywistego kodu (nie komentarzy itp.). Dostaję czasy kompilacji od około 30 do 3 minut w zależności od tego, czy usuwam wszystkie obiekty wynikowe. Nieczęsto zdarza mi się uszkodzenie GCC. Jednak to naprawdę kłopot, aby debugować i zmieniać kod w locie w tym czasie kompilacji! I debugować wszystkie moje programy na moim laptopie z Ubuntu, a następnie skompilować je do Pi! Działa świetnie! – yash101

4

Oto przewodnik How to build Raspberry Pi cross-compiler in Windows krok-po-kroku. Powodem, dla którego otrzymujesz błąd Illegal Instruction jest Raspbian z włączoną obsługą hardfp i wymaga odpowiednich poprawek dla gcc i eglibc do obsługi hardfp. W przeciwnym razie wygenerowany kod będzie używał innego ABI, tzn. Będzie przekazywał argumenty funkcji w różnych rejestrach, a więc awarię w środowisku wykonawczym.

Również błędne konfigurowanie GCC dla ARMv7 (Raspebby Pi to ARMv6) może prowadzić do błędu Illegal Instruction. Podczas konfigurowania GCC należy podać opcję --with-arch=armv6.

Przewodnik powiązany powyżej bazuje na GCC 4.6.3 chociaż. Ale myślę, że powinien działać również z GCC 4.7.

1

dockcross project to świetny punkt wyjścia dla całkowicie zdezynfekowanego łańcucha narzędzi, który można zbudować nie tylko dla Pi, ale także dla innych elementów. Oto komendy:

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' 

To cmake zbudowany jako dobrze.