Como fazer uma compilação cruzada de programas para o Raspberry Pi com gcc?

8

Gosto de usar o gcc para compilar pequenos programas C e C ++ no meu computador principal. No entanto, também tenho um Raspberry Pi e, sendo um computador de núcleo único de 700 MHz, eu preferiria não ter que fazer meu trabalho de desenvolvimento sempre que desejar criar um binário para ele. Como (porque eu sei que há uma maneira) compilar meu programa para o Raspberry Pi usando meu laptop x86? E existe uma maneira de compilar programas C (++) no Pi, mas produzir um binário x86? Se for de alguma ajuda, "O SoC é um Broadcom BCM2835. Este contém um ARM1176JZFS, com ponto flutuante ..." (de acordo com a FAQ oficial do Raspberry Pi ).

quadriculado
fonte
Há também Raspberry PI SE, aqui é uma pergunta que você pode obter no caminho certo: raspberrypi.stackexchange.com/questions/192/...
Lekensteyn
Boa resposta aqui: Cross-Compile for ARM?
Nobar

Respostas:

4

Usando uma combinação de bisbilhotar nos aptrepositórios e o extremamente excelente Building Embedded Linux Systems (2ª edição, 2008, O'Reilly), descobri o seguinte:

arm-linux-gnueabi-gcc

Esse é o nome do comando e o pacote que você instala para adquiri-lo. Uma vez chamado, ele atua exatamente como "baunilha" gcc, com a única exceção que cria pacotes para a arquitetura ARM (ou um subconjunto incluindo o BCM2835, pelo menos). A criação de sistemas Linux embarcados (págs. 93-94) explica que os nomes usados ​​para chamar as ferramentas GNU de uma maneira de compilação cruzada seguem este formato:

cpu-kernel-manufactuer-os

O -gccfinal do exemplo mais alto é o componente usado para especificar qual parte binutilsvocê deseja usar. Pode ser trocado por outro componente da cadeia de ferramentas GNU, como ld(linker) ou as(assembler). Pois arm-linux-gnueabi-gcc, armé a arquitetura, linuxé o kernel, gnueabié o sistema operacional e gccé o componente. Onde está o fabricante? Aparentemente, o fabricante pode ser especificado como "desconhecido", pois raramente faz diferença ou deixado de fora por completo (incluindo o que faria arm-linux-unknown-gnueabi-gcc).

quadriculado
fonte
1

Método oficialmente documentado

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

Testado no Ubuntu 17.10, repositório de ferramentas em 5caa7046982f0539cf5380f94da04b31129ed521

Ciro Santilli adicionou uma nova foto
fonte
0

Não tenho certeza de 100%, mas, usando https://tandrepires.wordpress.com/2012/08/01/raspberry-pi-openelec-pvr-dvb-t/ , você pode tentar: 1) Bibliotecas necessárias:

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 o projeto com as seguintes opções, onde N é o número de núcleos da sua CPU x86:

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

Espero que ajude. `

fernando garcía
fonte
Eu aprecio o esforço, realmente aprecio. Infelizmente, este tutorial (e a linha de código correspondente) makeserve para compilar um projeto que foi configurado para usar make ("PROJECT = RPi ARCH = arm PVR = yes make release -j N", o material anterior é apenas um monte de variáveis ​​de shell). Agora, na realidade, make usa o gcc, mas para usar a linha de código fornecida, eu precisaria obter a fonte do make e, em seguida, procurar na maioria das partes, pesquisando as diferentes partes do código que adicionariam os argumentos necessários ao gcc. Obrigado por tentar, no entanto!
Fouric