Кросс-компиляция для RaspBerry 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;
}

Как я могу правильно скомпилировать и запустить свою программу? Спасибо.

Ответ 1

На этой странице подробно рассказывается о том, как настроить кросс-компиляцию среды для вашей малины Pi. Удачи!

Ответ 2

Причина, по которой вы получаете ошибку 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).

Ответ 3

Я бы рекомендовал попробовать biicode, он автоматически настраивает среду кросс-компилятора для вас и отправляет сгенерированные двоичные файлы в малину после строительства

Ответ 4

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

Это готовая gcc-4.7.3 toolchain для armv6 с hardfp с использованием gnueabi. Я использую его, чтобы перекрестно скомпилировать С++ 11 для целевой задачи raspberrian.

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

Ответ 6

Проблема заключалась в использовании режима ASCII вместо двоичного режима в моих FTP-передачах. Сегодня я предпочитаю использовать SFTP (SSH). Спасибо.

Ответ 7

Используя Visual Studio и Visual GDB плагин, вы можете скачать кросс-компилятор для малины pi. После этого вы можете создать ssh-соединение, а также сможете удаленно развернуть свою программу в малиновый pi.