2012-06-10 4 views
51

TL/DR: Где я могу найти дополнительную информацию о создании кросс-компиляции GCC 4.7.0 для платформы ARM (gnueabi) (предназначенной для работы на устройстве Raspberry Pi)?Кросс-компиляция для малины Pi в GCC. Когда начать?

У меня только что появилась новая малина Pi, и я очень хочу начать программирование для нее. Мне удалось установить инструментарий GCC (я использую образ системы Arch Linux) и скомпилировал некоторые базовые программы, все работает нормально.

Я также пытался скомпилировать библиотеки Boost, потому что часто использовал их в своих проектах, и все, казалось, работало нормально, следуя инструкциям (./bootstrap.sh + ./b2), за исключением того факта, что компиляция была болезненно медленной. Я оставил его на несколько часов, но он едва прошел первые несколько исходных файлов. После того, как я оставил его на ночь, я обнаружил, что процесс сборки прерывается из-за нехватки ОЗУ.

Итак, я предполагаю, что Rasp Pi просто недостаточно для компиляции чего-то такого размера, как Boost. Итак, кросс-компиляция приходит мне на ум. Однако, несмотря на то, что в Интернете имеется много информации о кросс-компиляции ARM, я нахожу ее запутанной. Где можно даже начать?

У меня есть недавняя версия GCC (4.7.0), доступная на моем малине Pi, поэтому я идеально хотел бы перекрестно скомпилировать с той же версией. Где я могу получить GCC 4.7.0 toolchain для ARM? (Я буду компилировать на x86 CentOS 6.2)

Edit:

Я высвобождены ненужную память GPU и создать раздел подкачки 4 Гб на диске USB, в то время как файлы сборки на долю NFS. Boost теперь компилируется намного быстрее, поэтому он управляемый. Я все еще хотел бы знать, как я могу создать инструментальную цепочку GCC 4.7 для кросс-компиляции на моем компьютере x86, хотя, поскольку я намереваюсь много компилировать, и я бы хотел, чтобы это было как можно быстрее.

Edit 2:

Поскольку GCC 4.7.0 является относительно новым, как представляется, не быть предварительно встроенным кросс-компилятор (i386-> ARM). Вероятно, мне придется построить один сам, что кажется нетривиальной задачей (я пробовал и проваливал). Кто-нибудь знает, какой учебник следует для создания кросс-компилятора GCC, надеюсь, для одной из последних версий?

Я пробовал с this great shell script (который отлично поработал для создания компилятора с одинаковой архитектурой), и я успешно построил binutils и предпосылки GCC, но затем сборка GCC не сработала со многими загадочными ошибками. Я действительно потерялся здесь, поэтому я был бы очень признателен за вашу помощь.

GCC на Raspberry Pi был сконфигурирован с

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

мне удалось построить 4,7 GCC набора инструментов для ARM (яй!), Используя this shell script как предложено пользователем dwelch в Комментарии. Я также построил newlib и libstdc++ с помощью this article в качестве руководства. Инструментарий отлично работает, но я запустил исполняемый файл на моей малине Pi, он не с Illegal instruction. Что может быть причиной этого?

+1

Попробуйте пакет zram, если он еще не установлен. Это создаст сжатый RAM-обмен, который поможет вам больше, чем вы думаете. (Как ни странно.) Также добавьте прилично быстрое USB-устройство, либо жесткий диск USD, либо USB-накопитель высокого качества, и поменяйте его на swap. –

+3

Также в этой теме вы можете прочитать, как отключить графическую память, чтобы получить 32 мегабайта оперативной памяти: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=5&t=4831&p=65410 –

+1

Вау, спасибо , На самом деле у меня было 128 МБ для GPU. Неудивительно, что все было так медленно. – Tibor

ответ

2

Я не мог найти 4,7 гц, только 4.6. Для получения дополнительной информации, я собирал ядро ​​Пи на довольно старой Ubuntu машине (1 ГГц, 768MB RAM) следуя инструкции на этой странице: Kernel compilation

Сборка заняла около 90 минут, по сравнению с 6 часов он предположил, что это возьмет на себя Пи. Ядро отлично работает на Pi. Возможно, вы можете адаптировать эти рекомендации для кросс-компиляции других проектов на вашей машине x86 Linux.

24

Я нашел эти инструкции How to build a cross compiler for your Raspberry Pi. Это отличная прогулка с помощью инструмента crosstool-ng, который упрощает настройку кросс-компилятора. LOT (он имеет хороший интерфейс на основе проклятий) и поддерживает GCC 4.7.

Кажется, отлично работает!

4

http://github.com/dwelch67/raspberrypibuildgcc directory есть сценарий для 4,7 gcc/gnu и 3.0 clang/llvm. gnu, полученный из скрипта в проекте mpx в opencores, я вырезал gdb и libgcc, glibc и т. д., уложил его в компилятор. если вы хотите, чтобы другие вещи вырезали и вставляли руку для мип.

0

Как вы уже отметили, построение на малине Pi является медленным, но надежным (поскольку оно не является кросс-компиляцией), если вы не исчерпали память. Возможно, можно настроить настройки памяти и свопа, чтобы сделать большие сборки возможными (если не быстро). Я знаю, что на форумах люди говорят о том, чтобы помещать корневые разделы на SD, пользовательские разделы на USB-накопители, и, конечно же, это может повлиять на быструю (класс 6 или лучше) SD-карту. Возможно, со временем производительность компиляции улучшится по мере улучшения программного обеспечения. Или, может быть, у малины Pi 2 будет улучшенный чипсет и больше оперативной памяти. :-)

+0

Благодарим за предложение, но 30 минут на RPi против 1 минуты на мой ноутбук делает это ОЧЕНЬ нецелесообразным для развития, где у меня есть много перестройки. Если бы разница не была настолько резкой, я бы определенно строил устройство. – Tibor

+0

Да, я нахожусь в той же лодке, около 30 минут времени на RPi. Я собираюсь развиваться в Linux (Ubuntu VM на Mac OS X, на самом деле), а затем просто строит на RPi, когда я хочу протестировать его. Я надеюсь, что это будет адекватно моей цели (это разумная настройка), но если нет, я тоже буду кросс-компиляция. – mlepage

+0

Я не знаю, отличается ли мой Pi, но у меня один с 2012 года. Он разогнан до 1000 МГц. Тем не менее, он способен скомпилировать мою самую большую программу ~ 10k строк фактического кода (не комментарии и т. Д.). Я получаю время компиляции от 30 до 3 минут в зависимости от того, удаляю ли я все выходные объекты. Я редко получаю GCC segfault. Тем не менее, это действительно хлопот для отладки и изменения кода на лету с этим временем компиляции! Я отлаживаю все свои программы на своем ноутбуке с Ubuntu, а затем компилирую их для Pi! Работает отлично! – yash101

4

Поэтапный справочник How to build Raspberry Pi cross-compiler in Windows. Причина, по которой вы получаете ошибку Illegal Instruction, - это последняя версия Raspbian с поддержкой hardfp и требует соответствующих исправлений для gcc и eglibc для поддержки hardfp. В противном случае сгенерированный код будет использовать разные аргументы функции ABI, т. Е. Функции передачи в разных регистрах, поэтому сбой во время выполнения.

Также неверно сконфигурировать GCC для ARMv7 (Raspebby Pi ARMv6) может привести к ошибке Illegal Instruction. Обязательно укажите опцию --with-arch=armv6 при настройке GCC.

Руководство, приведенное выше, основано на GCC 4.6.3. Но я думаю, что он должен работать и с GCC 4.7.

1

Вы можете попробовать набор инструментов на: https://github.com/kallaballa/Raspberry-GCC-4.7.3

Это преднастроенным GCC-4.7.3 Набор инструментов для ARMv6 с hardfp использованием gnueabi. Я использую его для перекрестного компиляции C++ 11 для цели raspberrian.

Обратите внимание, что это работает только на хостах linux x86_64.

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 построен как хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^