Jak kompilować krzyżowo programy dla Raspberry Pi z gcc?

8

Lubię używać gcc do kompilacji małych małych programów C i C ++ na moim głównym komputerze. Mam jednak także Raspberry Pi, a będąc komputerem jednordzeniowym o częstotliwości 700 MHz wolałbym nie wykonywać na nim prac programistycznych za każdym razem, gdy chcę utworzyć plik binarny. W jaki sposób (bo wiem, że jest jakiś sposób) kompiluję krzyżowo mój program dla Raspberry Pi przy użyciu mojego laptopa x86? I czy jest sposób, że mogę skompilować programy C (++) na Pi, ale wygenerować plik binarny x86? Jeśli to jakaś pomoc, „SoC to Broadcom BCM2835. Zawiera ARM1176JZFS z zmiennoprzecinkową ...” (zgodnie z oficjalnym FAQ Raspberry Pi ).

czterolistny
źródło
Jest też Raspberry PI SE, oto pytanie, które może
poprowadzić
Dobra odpowiedź tutaj: Cross-Compile dla ARM?
nobar

Odpowiedzi:

4

Używając kombinacji przeszukiwania aptrepozytoriów i niezwykle doskonałych systemów Embedded Linux Systems (wydanie drugie, 2008, O'Reilly), znalazłem to:

arm-linux-gnueabi-gcc

Jest to zarówno nazwa polecenia, jak i pakiet instalowany w celu jego uzyskania. Po wywołaniu działa dokładnie jak „wanilia” gcc, z tym wyjątkiem, że buduje pakiety dla architektury ARM (lub przynajmniej podzestawu zawierającego co najmniej BCM2835). Budowanie wbudowanych systemów Linux (str. 93-94) wyjaśnia, że ​​nazwy używane do wywoływania narzędzi GNU w sposób kompilacji krzyżowej mają następujący format:

cpu-kernel-manufactuer-os

Na -gcckońcu najwyższego przykładu znajduje się komponent służący do określania, której części binutilschcesz użyć. Można go zamienić na inny komponent łańcucha narzędzi GNU, taki jak ld(linker) lub as(asembler). Dla arm-linux-gnueabi-gcc, armto architektura, linuxjest jądrem, gnueabijest OS i gccjest składnikiem. Gdzie jest producent? Najwyraźniej producenta można określić jako „nieznany”, ponieważ rzadko robi różnicę, lub całkowicie go pominąć (w tym by to zrobił arm-linux-unknown-gnueabi-gcc).

czterolistny
źródło
1

Metoda oficjalnie udokumentowana

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

Testowane w Ubuntu 17.10, repozytorium narzędzi w 5caa7046982f0539cf5380f94da04b31129ed521

Ciro Santilli
źródło
0

Nie jestem pewien na 100%, ale używając https://tandrepires.wordpress.com/2012/08/01/raspberry-pi-openelec-pvr-dvb-t/ , możesz spróbować: 1) Wymagane biblioteki:

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) Skompiluj projekt z następującymi opcjami, gdzie N jest liczbą rdzeni procesora x86:

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

Mam nadzieję, że to pomoże. `

Fernando García
źródło
Doceniam wysiłek, naprawdę. Niestety, ten samouczek (i odpowiadający mu wiersz kodu) makesłuży do kompilacji projektu skonfigurowanego do użycia make („PROJEKT = ARCHIWUM RPi = uzbrojenie PVR = tak make release -j N”, wcześniejszy materiał to tylko pęczek zmiennych powłoki). Teraz w rzeczywistości make używa gcc, ale aby użyć linii kodu, musiałbym uzyskać źródło make, a następnie przejrzeć większość z nich, szukając różnych części kodu, które dodałyby niezbędne argumenty do gcc. Ale dziękuję za próbę!
Fouric