Кросс-компиляция для RaspBerry Pi
С RaspBerry Pi и с моего компьютера я пытаюсь скомпилировать простой helloWorld, написанный на C++. Я использую код Sourcery toolchain для компиляции linux.
при копировании двоичного файла helloWorld в raspBerry с помощью TFTP и предоставлении ему разрешений на выполнение с помощью chmod появляется следующая ошибка:
"недопустимая инструкция"
если сделать "файл" над двоичным я вам: "raspberry: ELF 32-разрядный исполняемый файл LSB, ARM, версия 1 (SYSV), статически связанный, раздетый"
это потому, что я использовал "-static-static-libstdc++" при связывании.
Если я не использую статическую привязку, ошибка: "Ошибка сегментации"
Код:
/*
* main.cpp
*
* Created on: 26/06/2012
* Author: ccortiz
*/
#include <iostream>
using namespace std;
int main(void){
cout << "Hello Cross Compilling for ARM!" << endl << flush;
return 0;
}
Как я могу правильно скомпилировать и запустить свою программу? Спасибо.
7 ответов
на этой странице подробно рассказывает, как настроить среду кросс-компиляции для вашего Raspberry Pi. Удачи!
причина, почему вы получаете Segmentation fault
ошибка отличается ABI. Raspberry Pi при запуске Raspbian использует linux-arm-gnueabihf
ABI, который предполагает поддержку hardfp и VFP в аппаратном обеспечении (что редко встречается в среде ARMv6), поэтому требует некоторых дополнительных исправлений для GCC и EGLIBC (эти исправления можно найти в репозитории Raspbian).
ваш код Sourcery cross-toolchain, скорее всего, не имеет этих патчей, поэтому он использует другой ABI (linux-arm-gnueabi
), следовательно, сбой во время выполнения (статическое связывание работает, потому что ядро ABI не зависит от hardfp / softfp).
еще одна возможная причина, почему вы можете получить Illegal Instruction
ошибка-это перекрестная цепочка инструментов кода, настроенная для ARMv7, а Raspberry Pi-ARMv6. Но в этом случае как статическая, так и динамическая связь будут давать одну и ту же ошибку.
вот пошаговое руководство по созданию компилятора Raspberry Pi cross в Windows, обе версии hardfp / softfp ABI. В результате кросс-компилятор поддерживает C++ и не зависит от библиотеки времени выполнения cygwin (cygwin1.файл DLL.)
Я бы рекомендовал попробовать biicode, он автоматически настраивает среду кросс-компилятора для вас и отправляет созданные двоичные файлы в малину после построения
вы можете попробовать toolchain по адресу:https://github.com/kallaballa/Raspberry-GCC-4.7.3
Это предварительно построенный GCC-4.7.3 toolchain для armv6 с hardfp с использованием gnueabi. Я использую его для кросс-компиляции c++11 для цели raspberrian.
обратите внимание, что он работает только на хостах linux x86_64.
моя рекомендация здесьhttp://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/ Он хорошо объясняет, как использовать Eclipse для компиляции HelloWorld.cpp, загрузите и выполните его в Raspberry Pi board. Проверить его.
проблема заключалась в использовании режима ASCII вместо двоичного режима в моих FTP-передачах. Сегодня я предпочитаю использовать SFTP (SSH). Спасибо.
используя Visual studio и плагин Visual GDB, вы можете скачать кросс-компилятор для raspberry pi. После этого вы можете создать ssh-соединение, а также вы можете развернуть свою программу удаленно в raspberry pi.