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