Estou tentando obter compilação cruzada para Raspberry Pi trabalhando em minha máquina Ubuntu.
Durante minhas tentativas iniciais, usei o compilador arm-linux-gnueabi, que está disponível no repositório do Ubuntu. Eu tenho isso funcionando. Consegui construir todas as minhas dependências e usar o compilador cruzado em meu projeto cmake.
No entanto, acredito que devo usar a versão hf, então mudei para arm-linux-gnueabihf. Então percebi que isso não funciona com o Raspberry Pi, pois é armv6.
Depois de pesquisar no Google, encontrei o conjunto de ferramentas pré-compilado do GitHub .
Baixei o conjunto de ferramentas, mas realmente não entendo como "instalá-lo". Extraí os arquivos para meu diretório inicial. A estrutura do diretório é semelhante a esta:
/gcc-linearo-arm-linux-gnueabihf-raspbian
/arm-linux-gnueabihf
/bin
(contains g++, gcc, etc)
/lib
(contains libstdc++ library)
/bin
(contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
/lib
(gcc lib stuff)
Se eu mudar de diretório para a pasta bin INNER, poderei compilar um programa de teste do terminal sem problemas.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
Em seguida, tentei compilar um programa de teste na pasta OUTER bin, que contém as versões prefixadas das ferramentas.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
No entanto, quando tento usar o compilador agora (de fora do diretório bin interno), não consigo encontrar a biblioteca compartilhada libstdc ++ que vem com o conjunto de ferramentas:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
Além disso, quero poder usar o compilador sem precisar navegar até o diretório bin. Então, tentei adicionar o diretório OUTER bin (já que quero as versões prefixadas) e os dois diretórios lib ao meu PATH:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
No entanto, isso resulta no mesmo erro. Como devo "instalar" o conjunto de ferramentas para que possa usá-lo de qualquer lugar, assim como faço quando uso os compiladores cruzados do repositório do Ubuntu?
fonte
Respostas:
Vou tentar escrever isso como um tutorial para você, para que seja fácil de seguir.
NOTA: Este tutorial só funciona para imagens antigas do raspbian. Para o Raspbian mais recente baseado no Debian Buster, consulte o seguinte tutorial neste tópico: https://stackoverflow.com/a/58559140/869402
Pré requisitos
Antes de começar, você precisa se certificar de que o seguinte está instalado:
Vamos compilar uma pizza!
Comece criando uma pasta chamada em seu diretório pessoal
raspberrypi
.Vá para esta pasta e abra a pasta INTEIRA de ferramentas que você mencionou acima:
Você queria usar o seguinte dos 3
gcc-linaro-arm-linux-gnueabihf-raspbian
, se eu não li errado.Vá para o seu diretório inicial e adicione:
ao final do arquivo chamado
~/.bashrc
Agora você pode fazer logout e login novamente (ou seja, reiniciar sua sessão de terminal) ou executar
. ~/.bashrc
em seu terminal para pegar aPATH
adição em sua sessão de terminal atual.Agora, verifique se você pode acessar o compilador
arm-linux-gnueabihf-gcc -v
. Você deve obter algo assim:Mas ei! Eu fiz isso e as libs ainda não funcionam!
Ainda não terminamos! Até agora, fizemos apenas o básico.
Em sua
raspberrypi
pasta, crie uma pasta chamadarootfs
.Agora você precisa copiar todo o diretório
/lib
e/usr
para esta pasta recém-criada. Eu geralmente trago a imagem rpi e copio via rsync:onde
192.168.1.PI
é substituído pelo IP do seu Raspberry Pi.Agora, precisamos escrever um
cmake
arquivo de configuração. Abra~/home/raspberrypi/pi.cmake
em seu editor favorito e insira o seguinte:Agora você deve ser capaz de compilar seus
cmake
programas simplesmente adicionando esta bandeira Extra:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.Usando um exemplo cmake hello world :
fonte
ia32-libs
pacote não está disponível no Ubuntu 13.10. Eu usei em seulibc6-i386 lib32z1 lib32stdc++6
lugar.Construindo para imagens mais recentes do Raspbian Debian Buster e ARMv6
A resposta de @Stenyg só funciona para imagens Raspbian mais antigas. O Raspbian lançado recentemente baseado no Debian Buster requer um conjunto de ferramentas atualizado:
No Debian Buster, o compilador gcc e glibc foram atualizados para a versão 8.3. O conjunto de ferramentas
git://github.com/raspberrypi/tools.git
ainda é baseado na versão anterior do gcc 6. Isso significa que o usogit://github.com/raspberrypi/tools.git
levará a muitos erros de compilação.Este tutorial é baseado na resposta de @Stenyg. Além de muitas outras soluções na Internet, este tutorial também oferece suporte a Rasperry Pi (A, B, B +, Zero ) mais antigo baseado na CPU ARMv6. Veja também: GCC 8 Cross Compiler gera ARMv7 executável em vez de ARMv6
Configure o conjunto de ferramentas
Não há repositório git oficial contendo um conjunto de ferramentas atualizado (consulte https://github.com/raspberrypi/tools/issues/102 ).
Eu criei um novo repositório github que inclui a construção e conjuntos de ferramentas pré-compilados para ARMv6 com base no GCC8 e mais recente:
https://github.com/Pro/raspi-toolchain
Conforme mencionado no leia-me do projeto, essas são as etapas para obter o conjunto de ferramentas. Você também pode construí-lo sozinho (consulte o README para obter mais detalhes).
/opt/cross-pi-gcc
pois não é independente do local.Você terminou! O conjunto de ferramentas está agora em
/opt/cross-pi-gcc
Opcional, adicione o conjunto de ferramentas ao seu caminho, adicionando:
ao final do arquivo chamado
~/.bashrc
Agora você pode fazer logout e login novamente (ou seja, reiniciar sua sessão de terminal) ou executar
. ~/.bashrc
em seu terminal para pegar aPATH
adição em sua sessão de terminal atual.Obtenha as bibliotecas do Raspberry PI
Para fazer compilação cruzada para seu próprio Raspberry Pi, que pode ter algumas bibliotecas personalizadas instaladas, você precisa obter essas bibliotecas em seu host.
Crie uma pasta
$HOME/raspberrypi
. Em suaraspberrypi
pasta, crie uma pasta chamadarootfs
.Agora você precisa copiar todo o diretório
/lib
e/usr
para esta pasta recém-criada. Eu geralmente trago a imagem rpi e copio via rsync:onde
192.168.1.PI
é substituído pelo IP do seu Raspberry Pi.Use CMake para compilar seu projeto
Para dizer ao CMake para pegar seu próprio conjunto de ferramentas, você precisa ter um arquivo de conjunto de ferramentas que inicializa as configurações do compilador.
Obtenha este arquivo de conjunto de ferramentas aqui: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Agora você deve ser capaz de compilar seus
cmake
programas simplesmente adicionando este sinalizador extra:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
e definindo as variáveis de ambiente corretas:Um exemplo hello world é mostrado aqui: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
fonte
--safe-links
argumento/opt/cross-pi-gcc
?Não consegui fazer com que o compilador (
x64
versão) usasse osysroot
até adicionarSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
api.cmake
.fonte
Para host do Windows, quero recomendar fortemente este tutorial ::
Nada mais nada menos!
Conjuntos de ferramentas GNU pré-construídos disponíveis para Raspberry, Beaglebone, Cubieboard, AVR (Atmel) e mais
fonte
Você também pode usar o clang . Costumava ser mais rápido que o GCC e agora é bastante estável. É muito mais fácil criar clang a partir de fontes ( você pode realmente tomar uma xícara de café durante o processo de compilação ).
Em resumo:
Compile seu código:
Opcionalmente, você pode usar binutils arm-linux-gnueabihf legado. Então você pode remover o sinalizador "-fuse-ld = lld" no final.
Abaixo está o meu arquivo de conjunto de ferramentas cmake.
toolchain.cmake
fonte
Não consegui compilar o QT5 com nenhum dos conjuntos de ferramentas (razoavelmente desatualizados) de git: //github.com/raspberrypi/tools.git. O script de configuração continuava falhando com um erro "não foi possível determinar a arquitetura" e com enormes problemas de caminho para diretórios de inclusão. O que funcionou para mim foi usar o conjunto de ferramentas Linaro
em combinação com
Deixar de corrigir os links simbólicos do sysroot leva a erros de símbolo indefinidos, conforme descrito aqui: Um erro ao construir bibliotecas Qt para o raspberry pi Isso aconteceu comigo quando tentei o script fixQualifiedLibraryPaths de tools.git. Tudo o mais é descrito em detalhes em http://wiki.qt.io/RaspberryPi2EGLFS . Minhas configurações foram:
com / usr / local / rasp / sysroot sendo o caminho de minha cópia do sistema Raspberry Pi 3 Raspbian (Jessie) e / usr / local / qt5pi sendo o caminho do QT compilado cruzado que também deve ser copiado para o dispositivo. Esteja ciente de que Jessie vem com o GCC 4.9.2 quando você escolhe seu conjunto de ferramentas.
fonte
A questão inicial foi postada há algum tempo e, enquanto isso, o Debian fez um grande progresso na área de suporte multiarch.
Multiarch é uma grande conquista para compilação cruzada!
Em suma, as seguintes etapas são necessárias para alavancar multiarch para compilação cruzada Raspbian Jessie:
Como isso dá muito trabalho, automatizei a configuração acima. Você pode ler sobre isso aqui:
Compilação cruzada para Raspbian
fonte
há um CDP Studio IDE disponível que torna a compilação cruzada e a implantação bastante simples tanto do Windows quanto do Linux e você pode apenas marcar a caixa de seleção do raspberry toolchain durante a instalação. (PS. Ele tem suporte GPIO e I2C, então nenhum código é necessário para acessá-los)
A demonstração IDE do uso de framboesa está disponível aqui: https://youtu.be/4SVZ68sQz5U
e você pode baixar o IDE aqui: https://cdpstudio.com/home-edition
fonte