¿Cómo compilar programas para Raspberry Pi con gcc?


8

Me gusta usar gcc para compilar pequeños y pequeños programas C y C ++ en mi computadora principal. Sin embargo, también tengo una Raspberry Pi y, al ser una computadora de un solo núcleo de 700 MHz, preferiría no tener que hacer mi trabajo de desarrollo cada vez que quiera crear un binario para ella. ¿Cómo (porque sé que hay una manera) compilo mi programa para Raspberry Pi con mi laptop x86? ¿Y hay alguna manera de que pueda compilar programas C (++) en el Pi pero producir un binario x86? Si sirve de ayuda, "El SoC es un Broadcom BCM2835. Contiene un ARM1176JZFS, con coma flotante ..." (según las preguntas frecuentes oficiales de Raspberry Pi ).


También hay Raspberry PI SE, aquí hay una pregunta que puede
llevarlo

Buena respuesta aquí: ¿ Compilación cruzada para ARM?
nobar

Respuestas:


4

Utilizando una combinación de hurgar en los aptrepositorios y los extremadamente excelentes sistemas Building Embedded Linux (segunda edición, 2008, O'Reilly), encontré esto:

arm-linux-gnueabi-gcc

Ese es el nombre del comando y el paquete que instala para adquirirlo. Una vez invocado, actúa exactamente como "vainilla" gcc, con la única excepción de que crea paquetes para la arquitectura ARM (o un subconjunto que incluye al menos el BCM2835). Building Embedded Linux Systems (pág. 93-94) explica que los nombres utilizados para invocar las herramientas GNU de forma cruzada siguen este formato:

cpu-kernel-manufactuer-os

El -gccfinal del ejemplo superior es el componente , que se utiliza para especificar qué parte de binutilsusted desea usar. Se puede cambiar por otro componente de la cadena de herramientas GNU, como ld(enlazador) o as(ensamblador). Porque arm-linux-gnueabi-gcc, armes la arquitectura, linuxes el núcleo, gnueabies el sistema operativo y gcces el componente. ¿Dónde está el fabricante? Aparentemente, el fabricante se puede especificar como "desconocido", ya que rara vez hace la diferencia, o se puede omitir por completo (incluso lo haría arm-linux-unknown-gnueabi-gcc).


1

Método documentado oficialmente

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

Probado en Ubuntu 17.10, repositorio de herramientas en 5caa7046982f0539cf5380f94da04b31129ed521


0

No estoy seguro al 100%, pero, usando https://tandrepires.wordpress.com/2012/08/01/raspberry-pi-openelec-pvr-dvb-t/ , podría intentar: 1) Bibliotecas requeridas:

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) Compile el proyecto con las siguientes opciones, donde N es el número de núcleos de su CPU x86:

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

Espero que ayude. ``


Aprecio el esfuerzo, realmente lo hago. Desafortunadamente, este tutorial (y la línea de código correspondiente) se utilizan makepara compilar un proyecto que se configuró para usar make ("PROJECT = RPi ARCH = arm PVR = yes make release -j N", lo anterior es solo un montón de variables de shell). Ahora, en realidad make usa gcc, pero para usar la línea de código proporcionada, tendría que obtener la fuente de make y luego revisar la mayor parte buscando las diferentes partes de código que agregarían los argumentos necesarios para gcc. ¡Gracias por intentarlo!
Fouric
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.