Próbuję uzyskać kompilację krzyżową dla Raspberry Pi działającego na mojej maszynie Ubuntu.
Podczas moich pierwszych prób korzystałem z kompilatora arm-linux-gnueabi, który jest dostępny w repozytorium Ubuntu. Mam to działające. Udało mi się zbudować wszystkie moje zależności i użyć cross-kompilatora w moim projekcie cmake.
Uważam jednak, że powinienem używać wersji hf, więc przełączyłem się na arm-linux-gnueabihf. Wtedy zdałem sobie sprawę, że to nie działa z Raspberry Pi, ponieważ jest to armv6.
Po pewnym Googlingu znalazłem gotowy zestaw narzędzi z GitHub .
Ściągnąłem toolchain, ale tak naprawdę nie rozumiem, jak go „zainstalować”. Rozpakowałem pliki do mojego katalogu domowego. Struktura katalogów wygląda następująco:
/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)
Jeśli zmienię katalog na folder INNER bin, jestem w stanie bez problemu skompilować program testowy z terminala.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
Następnie próbowałem skompilować program testowy w folderze OUTER bin, który zawiera prefiksowane wersje narzędzi.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
Jednak gdy próbuję teraz użyć kompilatora (spoza wewnętrznego katalogu bin), nie mogę znaleźć biblioteki współdzielonej libstdc ++, która jest dostarczana z łańcuchem narzędzi:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
Ponadto chcę mieć możliwość korzystania z kompilatora bez konieczności przechodzenia do katalogu bin. Próbowałem więc dodać katalog bin OUTER (ponieważ chcę wersje z prefiksami) i oba katalogi lib do mojej PATH:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Jednak powoduje to ten sam błąd. Jak powinienem „zainstalować” łańcuch narzędzi, aby móc używać go z dowolnego miejsca, tak jak mogę, gdy używam cross-kompilatorów z repozytorium Ubuntu?
źródło
Odpowiedzi:
Postaram się napisać to jako samouczek, aby było łatwe do naśladowania.
UWAGA: Ten samouczek działa tylko dla starszych obrazów raspbian. W przypadku nowszego Raspbian opartego na Debian Buster zobacz następujące instrukcje w tym wątku: https://stackoverflow.com/a/58559140/869402
Wymagania wstępne
Zanim zaczniesz, upewnij się, że zainstalowano:
Skompilujmy ciasto!
Zacznij od utworzenia folderu w swoim katalogu domowym o nazwie
raspberrypi
.Przejdź do tego folderu i rozwiń CAŁY folder narzędzi, o którym wspomniałeś powyżej:
Chciałeś użyć następujących z 3
gcc-linaro-arm-linux-gnueabihf-raspbian
, jeśli nie przeczytałem źle.Przejdź do katalogu domowego i dodaj:
do końca nazwanego pliku
~/.bashrc
Teraz możesz się wylogować i zalogować ponownie (tj. Zrestartować sesję terminala) lub uruchomić
. ~/.bashrc
w terminalu, aby odebraćPATH
dodatek w bieżącej sesji terminala.Teraz sprawdź, czy masz dostęp do kompilatora
arm-linux-gnueabihf-gcc -v
. Powinieneś dostać coś takiego:Ale hej! Zrobiłem to, a biblioteki nadal nie działają!
Jeszcze nie skończyliśmy! Jak dotąd zrobiliśmy tylko podstawy.
W swoim
raspberrypi
folderze utwórz folder o nazwierootfs
.Teraz musisz skopiować cały katalog
/lib
i/usr
do tego nowo utworzonego folderu. Zwykle podnoszę obraz rpi i kopiuję go przez rsync:gdzie
192.168.1.PI
jest zastąpiony adresem IP twojego Raspberry Pi.Teraz musimy napisać
cmake
plik konfiguracyjny. Otwórz~/home/raspberrypi/pi.cmake
w swoim ulubionym edytorze i wstaw:Teraz powinieneś być w stanie opracować swoje
cmake
programy po prostu dodając ten dodatkowy flagę:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.Na przykładzie cmake hello world :
źródło
ia32-libs
Pakiet nie jest dostępny na Ubuntu 13.10.libc6-i386 lib32z1 lib32stdc++6
Zamiast tego użyłem .Tworzenie dla nowszych obrazów Raspbian Debian Buster i ARMv6
Odpowiedź @Stenyg działa tylko w przypadku starszych obrazów Raspbian. Niedawno wydany Raspbian oparty na Debian Buster wymaga zaktualizowanego zestawu narzędzi:
W Debian Buster kompilator gcc i glibc zostały zaktualizowane do wersji 8.3. Łańcuch narzędzi w
git://github.com/raspberrypi/tools.git
nadal jest oparty na starszej wersji gcc 6. Oznacza to, że użyciegit://github.com/raspberrypi/tools.git
spowoduje wiele błędów kompilacji.Ten samouczek jest oparty na odpowiedzi @Stenyg. Oprócz wielu innych rozwiązań w Internecie, ten poradnik obsługuje również starsze Rasperry Pi (A, B, B +, Zero ) oparte na procesorze ARMv6. Zobacz też: GCC 8 Cross Compiler wysyła plik wykonywalny ARMv7 zamiast ARMv6
Skonfiguruj łańcuch narzędzi
Nie ma oficjalnego repozytorium git zawierającego zaktualizowany łańcuch narzędzi (patrz https://github.com/raspberrypi/tools/issues/102 ).
Stworzyłem nowe repozytorium github, które zawiera budowanie i prekompilowane zestawy narzędzi dla ARMv6 w oparciu o GCC8 i nowsze:
https://github.com/Pro/raspi-toolchain
Jak wspomniano w pliku Readme projektu, są to kroki, aby uzyskać zestaw narzędzi. Możesz również zbudować go samodzielnie (więcej szczegółów znajdziesz w pliku README).
/opt/cross-pi-gcc
ponieważ nie jest niezależny od lokalizacji.Gotowe! Łańcuch narzędzi jest teraz dostępny
/opt/cross-pi-gcc
Opcjonalnie dodaj łańcuch narzędzi do swojej ścieżki, dodając:
do końca nazwanego pliku
~/.bashrc
Teraz możesz się wylogować i zalogować ponownie (tj. Zrestartować sesję terminala) lub uruchomić
. ~/.bashrc
w terminalu, aby odebraćPATH
dodatek w bieżącej sesji terminala.Pobierz biblioteki z Raspberry PI
Aby skompilować krzyżowo dla własnego Raspberry Pi, który może mieć zainstalowane biblioteki niestandardowe, musisz pobrać te biblioteki na swój host.
Utwórz folder
$HOME/raspberrypi
. W swoimraspberrypi
folderze utwórz folder o nazwierootfs
.Teraz musisz skopiować cały katalog
/lib
i/usr
do tego nowo utworzonego folderu. Zwykle podnoszę obraz rpi i kopiuję go przez rsync:gdzie
192.168.1.PI
jest zastąpiony adresem IP twojego Raspberry Pi.Użyj CMake do skompilowania projektu
Aby nakazać CMake wzięcie własnego łańcucha narzędzi, musisz mieć plik toolchain, który inicjalizuje ustawienia kompilatora.
Pobierz ten plik toolchain stąd: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Teraz powinieneś być w stanie skompilować swoje
cmake
programy, po prostu dodając tę dodatkową flagę:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
i ustawiając poprawne zmienne środowiskowe:Przykładowy świat hello pokazano tutaj: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
źródło
--safe-links
kłótni/opt/cross-pi-gcc
?Nie mogłem dostać kompilator (
x64
wersja) do używaniasysroot
aż dodałemSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
dopi.cmake
.źródło
W przypadku hosta z systemem Windows bardzo polecam ten samouczek ::
Nic dodać nic ująć!
Gotowe zestawy narzędzi GNU dostępne dla Raspberry, Beaglebone, Cubieboard, AVR (Atmel) i innych
źródło
Możesz również użyć clang . Kiedyś był szybszy niż GCC, a teraz jest całkiem stabilny. Dużo łatwiej jest zbudować brzęk ze źródeł ( podczas budowania można naprawdę wypić filiżankę kawy ).
W skrócie:
Skompiluj swój kod:
Opcjonalnie możesz użyć starszej wersji arm-linux-gnueabihf binutils. Następnie możesz usunąć flagę „-fuse-ld = lld” na końcu.
Poniżej znajduje się mój plik narzędzi cmake.
toolchain.cmake
źródło
Nie mogłem skompilować QT5 z żadnym z (dość przestarzałych) łańcuchów narzędzi z git: //github.com/raspberrypi/tools.git. Skrypt konfiguracyjny wciąż kończył się niepowodzeniem z błędem „nie można określić architektury” oraz z ogromnymi problemami ze ścieżkami dla katalogów dołączanych. U mnie zadziałało używanie łańcucha narzędzi Linaro
w połączeniu z
Niepowodzenie naprawy dowiązań symbolicznych sysroot prowadzi do niezdefiniowanych błędów symboli, jak opisano tutaj: Błąd podczas tworzenia bibliotek Qt dla raspberry pi To zdarzyło mi się, gdy wypróbowałem skrypt fixQualifiedLibraryPaths z tools.git. Wszystko inne jest szczegółowo opisane w http://wiki.qt.io/RaspberryPi2EGLFS . Moje ustawienia konfiguracyjne to:
gdzie / usr / local / rasp / sysroot to ścieżka do mojej lokalnej kopii systemu Raspberry Pi 3 Raspbian (Jessie), a / usr / local / qt5pi to ścieżka do skompilowanego krzyżowo QT, który również musi zostać skopiowany na urządzenie. Pamiętaj, że Jessie jest dostarczana z GCC 4.9.2, kiedy wybierasz swój toolchain.
źródło
Pierwsze pytanie zostało wysłane już jakiś czas temu, aw międzyczasie Debian poczynił ogromne postępy w dziedzinie obsługi multiarch.
Multiarch to świetne osiągnięcie dla kompilacji krzyżowej!
W skrócie, aby wykorzystać multiarchę do kompilacji krzyżowej Raspbian Jessie, wymagane są następujące kroki:
Ponieważ jest to dużo pracy, zautomatyzowałem powyższą konfigurację. Możesz o tym przeczytać tutaj:
Kompilacja krzyżowa dla Raspbian
źródło
dostępne jest IDE CDP Studio, które sprawia, że kompilacja krzyżowa i wdrażanie są dość proste zarówno w systemie Windows, jak i na Linuksie. Możesz po prostu zaznaczyć pole wyboru łańcucha narzędzi raspberry podczas instalacji. (PS. Ma obsługę GPIO i I2C, więc nie jest potrzebny kod, aby uzyskać do nich dostęp)
Demo IDE użycia maliny jest tutaj: https://youtu.be/4SVZ68sQz5U
i możesz pobrać IDE tutaj: https://cdpstudio.com/home-edition
źródło