Как кросс-компилировать программы для Raspberry Pi с помощью gcc?


8

Мне нравится использовать gcc для компиляции небольших программ на C и C ++ на моем главном компьютере. Тем не менее, у меня также есть Raspberry Pi, и, будучи одноядерным компьютером с частотой 700 МГц, я бы предпочел, чтобы мне не приходилось заниматься его разработкой каждый раз, когда я хочу создать для него двоичный файл. Как (поскольку я знаю, что есть способ) я могу кросс-компилировать свою программу для Raspberry Pi, используя мой ноутбук x86? И есть ли способ, которым я могу компилировать программы на C (++) на Pi, но создать бинарный файл x86? Если это поможет, «SoC - это Broadcom BCM2835. Он содержит ARM1176JZFS с плавающей запятой ...» (согласно официальному FAQ Raspberry Pi ).


Существует также Raspberry PI SE, вот вопрос, который поможет вам
выбрать

Хороший ответ здесь: кросс-компиляция для ARM?
Нобар

Ответы:


4

Используя комбинацию поиска в aptрепозиториях и чрезвычайно превосходных Building Embedded Linux Systems (2nd edition, 2008, O'Reilly), я обнаружил следующее:

рука-линукс-gnueabi-НКУ

Это и имя команды, и пакет, который вы устанавливаете для ее получения. После вызова он действует точно как «ваниль» gcc, за исключением того, что он создает пакеты для архитектуры ARM (или, по крайней мере, подмножество, включающее BCM2835). Построение встраиваемых Linux-систем (стр. 93-94) объясняет, что имена, используемые для вызова инструментов GNU методом кросс-компиляции, соответствуют следующему формату:

CPU-ядра Manufactuer-Os

В -gccконце самого верхнего примера находится компонент , используемый для указания, какую часть binutilsвы хотите использовать. Его можно поменять на другой компонент цепочки инструментов GNU, такой как ld(линкер) или as(ассемблер). Для arm-linux-gnueabi-gcc, armэто архитектура, linuxявляется ядром, gnueabiявляется операционной системой, и gccявляется компонентом. Где производитель? По-видимому, производитель может быть указан как «неизвестный», так как он редко что-то меняет, или вообще не учитывается (в том числе это будет иметь значение arm-linux-unknown-gnueabi-gcc).


1

Официально документированный метод

https://www.raspberrypi.org/documentation/linux/kernel/building.md ( GitHub )

git clone https://github.com/raspberrypi/tools
export PATH="$(pwd)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:${PATH}"
printf '#include <stdio.h>\nint main() { puts("hello world"); }\n' > hello_world.c
printf '#include <iostream>\nint main() { std::cout << "hello world" << std::endl; }\n' > hello_world.cpp
arm-linux-gnueabihf-gcc -std=c99 -o hello_world_c hello_world.c
arm-linux-gnueabihf-g++ -std=c++11 -o hello_world_cpp hello_world.cpp

Протестировано в Ubuntu 17.10, репозиторий инструментов на 5caa7046982f0539cf5380f94da04b31129ed521


0

Я не уверен в 100%, но, используя https://tandrepires.wordpress.com/2012/08/01/raspberry-pi-openelec-pvr-dvb-t/ , вы можете попробовать: 1) Необходимые библиотеки:

sudo apt-get install g++ git nasm flex bison gawk gperf autoconf automake m4 cvs libtool \
byacc texinfo gettext zlib1g-dev libncurses5-dev git-core build-essential xsltproc libexpat1-dev zip \
autopoint xfonts-utils libxml-parser-perl libproc-processtable-perl default-jre

2) Скомпилируйте проект со следующими параметрами, где N - количество ядер вашего процессора x86:

$ PROJECT=RPi ARCH=arm PVR=yes make release -j N

Я надеюсь, что это помогает. `


Я ценю усилия, я действительно ценю. К сожалению, этот урок (и соответствующая строка кода) предназначен для makeкомпиляции проекта, который был настроен для использования make ("PROJECT = RPi ARCH = arm PVR = yes make release -j N", то, что раньше было просто куча переменных оболочки). Теперь, в действительности, make используется gcc, но для использования предоставленной строки кода мне нужно было бы получить источник make, а затем просмотреть большую часть его в поисках различных частей кода, которые добавили бы необходимые аргументы для gcc. Спасибо за попытку, хотя!
четыре
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.