2012-06-26 6 views
11

С RaspBerry Pi и с моего компьютера я пытаюсь перекрестно скомпилировать простой helloWorld, написанный на C++. Я использую toolchain Code Sourcery для компиляции linux.Кросс-компиляция для RaspBerry Pi

Когда скопировать Helloworld двоичный файл малина по протоколу TFTP и дать ему разрешения на выполнение с CHMOD, появляется следующее сообщение об ошибке:

«Illegal инструкция»

Если сделать «файл» над двоично я получаю: «малина: 32-битный LSB-файл ELB, 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; 
} 

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

+0

пожалуйста размещать привет источник мира и разборку, если бинарный файл. –

+0

Я думал, что одним из преимуществ RaspberryPi является то, что он работает с полной ОС, вам не нужно перекрестно скомпилировать. –

+1

Да, но компиляция на малине медленнее, чем компиляция в моем Core i5. Но я также хочу проконсультироваться с моим любимым Eclipse. –

ответ

16

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

+0

Спасибо. crosstools-ng работает правильно для меня. –

+0

@CesarOrtiz, если это сработало, вы должны принять этот ответ. – TheLukeMcCarthy

6

Причина, по которой вы получаете Segmentation fault Ошибка отличается ABI. Raspberry Pi при запуске Raspbian использует linux-arm-gnueabihf ABI, который предполагает поддержку жесткого диска и VFP на оборудовании (что редко встречается в среде ARMv6), поэтому для некоторых GCC и EGLIBC требуются некоторые дополнительные исправления (эти исправления можно найти в репозитории Raspbian).

Ваш код Sustcery cross-toolchain, скорее всего, не имеет этих патчей, поэтому он использует другой ABI (linux-arm-gnueabi), следовательно, сбой во время выполнения (статическое связывание работает, потому что ядро ​​ABI не зависит от hardfp/softfp).

Другая возможная причина, по которой вы можете получить Illegal Instruction ошибка Код Sourcery cross-toolchain настроен для ARMv7, а малина Pi - ARMv6. Но в этом случае как статическое, так и динамическое связывание даст ту же ошибку.

Here is a step-by-step guide how to build Raspberry Pi cross compiler in Windows, обе версии hardfp/softfp ABI. Результирующий кросс-компилятор поддерживает C++ и не зависит от библиотеки времени выполнения cygwin (cygwin1.dll).

0

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

1

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

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

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

0

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

3

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

+0

ссылка не работает. – Hannes

+0

исправлено, спасибо за рассказ – hithwen