Ответ 1
На этой странице подробно рассказывается о том, как настроить кросс-компиляцию среды для вашей малины Pi. Удачи!
С RaspBerry Pi и с моего компьютера я пытаюсь перекрестно скомпилировать простой helloWorld, написанный на С++. Я использую toolchain Code Sourcery для компиляции linux.
При копировании двоичного файла helloWorld в raspBerry с помощью TFTP и предоставления ему разрешений на выполнение с помощью chmod появляется следующая ошибка:
"Незаконная инструкция"
Если сделать "файл" над двоичным, я получаю: "малина: 32-разрядный исполняемый файл ELF ELF, ARM, версия 1 (SYSV), статически связанная, разделенная"
Это связано с тем, что при связывании я использовал "-static -static-libstdС++".
Если я не использую статическое связывание, ошибка: "Ошибка сегментации"
Код:
/*
* 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;
}
Как я могу правильно скомпилировать и запустить свою программу? Спасибо.
На этой странице подробно рассказывается о том, как настроить кросс-компиляцию среды для вашей малины Pi. Удачи!
Причина, по которой вы получаете ошибку Segmentation fault
, отличается от ABI. Raspberry Pi при запуске Raspbian использует linux-arm-gnueabihf
ABI, который предполагает поддержку hardfp и VFP на оборудовании (что редко встречается в среде ARMv6), поэтому для некоторых GCC и EGLIBC требуются некоторые дополнительные исправления (эти исправления можно найти в репозитории Raspbian).
Скотч-цепочка вашего кода Sourcery, скорее всего, не имеет этих патчей, поэтому он использует другой ABI (linux-arm-gnueabi
), следовательно, сбой во время выполнения (статическое связывание работает, потому что ядро ABI не зависит от hardfp/softfp).
Другая возможная причина, по которой вы можете получить ошибку Illegal Instruction
, - это перекрестная привязка Code Sourcery, настроенная для ARMv7, а Raspberry Pi - ARMv6. Но в этом случае как статическое, так и динамическое связывание даст ту же ошибку.
Ниже приведено пошаговое руководство по созданию кросс-компилятора Raspberry Pi в Windows, как версии hardfp/softfp ABI. Результирующий кросс-компилятор поддерживает С++ и не зависит от библиотеки времени выполнения cygwin (cygwin1.dll).
Я бы рекомендовал попробовать biicode, он автоматически настраивает среду кросс-компилятора для вас и отправляет сгенерированные двоичные файлы в малину после строительства
Вы можете попробовать toolchain по адресу: https://github.com/kallaballa/Raspberry-GCC-4.7.3
Это готовая gcc-4.7.3 toolchain для armv6 с hardfp с использованием gnueabi. Я использую его, чтобы перекрестно скомпилировать С++ 11 для целевой задачи raspberrian.
Обратите внимание, что он работает только с хостами Linux x86_64.
Моя рекомендация здесь, http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/ Он неплохо справляется с объяснением того, как использовать Eclipse для компиляции HelloWorld.cpp, загрузки и выполнения его в Ribberry pi board. Проверьте это.
Проблема заключалась в использовании режима ASCII вместо двоичного режима в моих FTP-передачах. Сегодня я предпочитаю использовать SFTP (SSH). Спасибо.
Используя Visual Studio и Visual GDB плагин, вы можете скачать кросс-компилятор для малины pi. После этого вы можете создать ssh-соединение, а также сможете удаленно развернуть свою программу в малиновый pi.