Pokażę jak poprawnie przygotować sobie środowisko i narzędzia do pisania programów z wykorzystaniem bibliotek Qt na popularnej platformie Raspberry Pi. Ten artykuł jest przeznaczony tylko dla nerdów, jeśli nie wiesz o co chodzi już w tytule, to nie czytaj dalej ( ͡° ͜ʖ ͡°)
Ponieważ kompilacja ze źródeł bibliotek Qt na "malinie" potrwałaby pewnie z tydzień, znacznie lepszą opcją będzie dokonanie kompilacji skrośnej na PC, podobnie sprawa ma się z czasami budowania programów na PC jest szybciej i wygodniej.
Poniżej przedstawiłem schemat do którego dążymy:
Piszemy nasze programy na PC korzystając z Qtcreatora - IDE dołączonego do bibliotek Qt. Kompilacja programów dla Raspberry Pi również odbywa się na PC, a dopiero wynikowy plik binarny zostaje wysłany i uruchomiony automatycznie na samej malinie.
No więc zaczynamy:
_
1. Potrzebujemy komputera z zainstalowaną dowolną dystrybucją Linuksa, ja używam aktualnie Ubuntu GNOME 15.10, ale podawane komendy powinny działać identycznie na każdej dystrybucji bazującej na Debianie.
_
2. Potrzebny nam będzie czysty i świeży obraz najnowszego raspbiana- najpopularniejszej dystrybucji Linuksa na platformę Raspberry Pi. Ściągamy go stąd:
https://downloads.raspberrypi.org/raspbian_latest
Wkładamy kartę micro SD do czytnika w naszym komputerze i wydajemy komendę:
lsblk
w odpowiedzi powinniśmy dostać drzewko z wszystkimi dyskami podłączonymi do naszego komputera, najbardziej interesuje nas identyfikator karty powinno to być coś w stylu:
mmcblk0 179:0 0 7,2G 0 disk
_
3. Wchodzimy z poziomu konsoli do katalogu gdzie pobraliśmy obraz Raspbiana i wydajemy ulubione polecenie naszego byłego prezydenta ( ͡° ͜ʖ ͡°) kopiując obraz systemu na kartę, której identyfikator odczytaliśmy punkt wyżej:
sudo dd if=2016-02-26-raspbian-jessie.img of=/dev/mmcblk0 bs=4M
Kopiowanie trochę trwa- nawet kilkanaście minut, można w tym czasie pooglądać śmieszne obrazki na
ulubionym portalu ze śmiesznymi obrazkami.
_
4. Po zakończeniu kopiowania wkładamy naszą kartę do maliny i uruchamiamy nasz nowiuteńki system. Używając
raspi-config włączamy bootowanie do samej konsoli bez uruchamiania Xów(Boot Options -> Console), oraz przydzielamy 256 MB RAM dla GPU(Advenced Options -> Memory Split -> 256MB)
Następnie odblokowujemy repozytoria non-free
sudo nano /etc/apt/sources.list
Odkomentowując linię
deb-src //archive.raspbian.org/raspbian/ jessie main contrib non-free rpi
_
4.76 instalujemy kilka potrzebnych bibliotek:
sudo apt-get update
sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev
oraz tworzymy i przydzielamy do użytkownika
pi katalog na nasze biblioteki
sudo mkdir /usr/local/qt5pi
sudo chown pi:pi /usr/local/qt5pi
_
5. Wracamy do PC'ta....
Przygotowujemy sobie katalog na biblioteki oraz toolchain dla naszej maliny(nie musi koniecznie być w katalogu domowym, można gdzieś indziej, ale w kolejnych krokach należy zwrócić uwagę na ścieżki do plików)
mkdir ~/raspi
cd ~/raspi
_
6. Pobieramy toolchain(kompilator, linker, debugger itd..) - wymagany git(jeśli nie masz: sudo apt-get install git)
**git clone
https://github.com/raspberrypi/tools**
_
7. Tworzymy sobie minimalny unixowy system plików - symulujący układ plików na malinie.
mkdir sysroot sysroot/usr sysroot/opt
Synchronizujemy zawartość folderów z malinką - musimy też znać adres IP naszego Raspberry Pi:
rsync -avz pi@IP:/lib sysroot
rsync -avz pi@IP:/usr/include sysroot/usr
rsync -avz pi@IP:/usr/lib sysroot/usr
rsync -avz pi@IP:/opt/vc sysroot/opt
_
8. Poprawiamy symlinki - tak aby ścieżki były relatywne(odnosiły się do katalogów począwszy od sysroot, a nie całego systemu). Nie zastanawiając się za długo nad znaczeniem poprzedniego zdania po prostu pobieramy i uruchamiamy skrypt pythona:
**wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py**
**chmod +x sysroot-relativelinks.py**
**./sysroot-relativelinks.py sysroot**
_
9. Teraz pobieramy źródła bibliotek Qt w najnowszej wersji:
git clone git://code.qt.io/qt/qt5.git
cd qt5
git checkout 5.6
Następnie uruchamiamy skrypt perla który sklonuje nam z repozytorium moduły bibliotek Qt, jeśli nie podamy ich listy skopiuje wszystko, może to potrwać dłużej, aby zaoszczędzić czasu polecam nie pobierać na początku tych modułów:
-qtwebkit,-qtwebkit-examples,-qtwebengine
zawsze można wywołać ten skrypt ponownie i pobrać resztę. Zostańmy przy domyślnym zestawie
perl init-repository --module-subset=default
W zależności od prędkości internetu pobieranie może trochę potrwać....
_
10. Gdy już wszystko się pobierze zabieramy się za konfigurację naszych bibliotek, w zależności od modelu posiadanego raspberry pi dajemy -device linux-rasp-pi-g++(dla raspberry pi 1) lub -device linux-rasp-pi2-g++ (dla raspberry pi 2)
./configure \
-release \
-opengl es2 \
-device linux-rasp-pi2-g++ \
-device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- \
-sysroot ~/raspi/sysroot \
-opensource -confirm-license \
-make libs \
-prefix /usr/local/qt5pi \
-extprefix ~/raspi/qt5pi \
-hostprefix ~/raspi/qt5 -v
Po poprawnym zakończeniu konfiguracji kompilujemy to wszystkowydając polecenie:
make
Teraz drogi czytelniku możesz sobie iść zrobić, obiad, kolację przywitać się z rodziną, która dawno Cię nie widziała, bo kucowałeś godzinami przed komputerem itd.... Kompilacja potrwa kilka godzin w zależności od tego jak mocny procesor posiadasz, na Raspberry Pi trwałaby kilka dni ( ͡° ͜ʖ ͡°)
_
11. Gdy już wreszcie kompilacja się skończy instalujemy wszystko poleceniem:
make install
Po skończonej instalacji synchronizujemy katalogi z maliną:
rsync -avz qt5pi pi@IP:/usr/local
_
12. Kompilujemy i wysyłamy do maliny przykładowy program(na razie ręcznie):
cd qtbase/examples/opengl/qopenglwidget
~/raspi/qt5/bin/qmake
make
scp qopenglwidget pi@IP:/home/pi
_
13. Na malinie dajemy linkerowi znaleźć nasze nowe biblioteki:
echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
sudo ldconfig
_
14. Wykonujemy poprawki związane z EGL/GLES
The device may have the Mesa version of libEGL and libGLESv2 in /usr/lib/arm-linux-gnueabihf, resulting Qt apps picking these instead of the real thing from /opt/vc/lib. This may be fine for X11 desktop apps not caring about OpenGL performance but is totally useless for windowing system-less, fullscreen embedded apps.
sudo rm /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
_
15. Na malinie wchodzimy do katalogu domowego i uruchamiamy nasz przykładowy program:
./qopenglwidget
Na ekranie podłączonym do RaspberryPi powinna się uruchomić nasza aplikacja.
_
16. Instalujemy najnowszą wersję Qt na PC wraz z Qt creatorem. Pobieramy instalator stąd:
//download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run
Po pobraniu wchodzimy do katalogu w którym zapisaliśmy nasz plik i nadajemy mu prawa do uruchomienia:
chmod +x qt-unified-linux-x64-2.0.2-2-online.run
i uruchamiamy jako root:
sudo ./qt-unified-linux-x64-2.0.2-2-online.run
Powinien się uruchomić graficzny instalator. Polecam jako katalog do instalacji wybrać sugerowany /opt/Qt
Następnie zaznaczamy komponenty jak poniżej:
i klikamy "Dalej" instalator pobierze i zainstaluje biblioteki, oraz Qt creatora.
_
17. Konfiguracja RaspberryPi w Qt Creatorze - uruchamiamy nasze IDE i kolejno:
Narzędzia -> Opcje -> Urządzenia
-Dodaj
---Nazwa: Malina
---Ogólne Urządzenie Linuksowe
---Wpisujemy adres IP naszej maliny, login(pi) i hasło(raspberry)
Narzędzia -> Opcje -> Kompilatory
-Dodaj
---Nazwa: raspi-GCC
---GCC
---ścieżka kompilatora: ~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++
Narzędzia -> Opcje -> Debuggery
-Dodaj
---Nazwa: raspi-GDB
---ścieżka ~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gdb
Narzędzia -> Opcje -> wersje Qt
-dodajemy ścieżkę do qmake ~/raspi/qt5/bin/qmake
Narzędzia -> Opcje -> Budowanie i Uruchamianie
-Zestawy Narzędzi
-Dodaj
---Nazwa: Malina-DEPLOY
---Typ Urządzenia: Ogólne Urządzenie Linuksowe
---Urządzenie: Malina
---Sysroot: ~/raspi/sysroot
---Kompilator: raspi-GCC
---Debugger: raspi-GDB
---wersja Qt: 5.6.0 dla Qt5
---Qt mkspec: pusty
_
18. NARESZCIE WSZYSTKO GOTOWE - OD TERAZ MOŻESZ SWOBODNIE KUCOWAĆ PROGRAMY NA SWOJĄ MALINĘ WPROST ZE SWOJEGO PCta.
_
19. Dla testu wybieramy sobie jakiś przykład z Powitanie -> Przykłady
Ja wybrałem QML VIDEO SHADER EFFECT
W oknie konfiguracji naszego projektu zaznaczamy dodatkowo nasz zestaw Malina-DEPLOY
Ważne też żeby w pliku .pro zmienić
target.path = $$[QT
INSTALLEXAMPLES]/multimedia/video/qmlvideofx
na
target.path = /home/pi
następnie klikamy w Dużą ikonę z komputerem po lewej stronie i wybieramy nasz zestwa Malina-DEPLOY i naciskamy ikonę młotka aby zbudować program.
Gdy już się zbuduje wciskamy Run i cieszymy się aplikacją odpaloną zdalnie na malinie ( ͡° ͜ʖ ͡°)
źródła:
https://wiki.qt.io/RaspberryPi2EGLFS
https://wiki.qt.io/Building_Qt_5_from_Git
//www.ics.com/blog/building-qt-5-raspberry-pi
Komentarze (123)
najlepsze
A to spoko, masz wykop (⌐ ͡■ ͜ʖ ͡■)
@picza_morda:
Komentarz usunięty przez moderatora
Spoko, jestem kucem - politykę potrafię wpleść w prognozę pogody xD
A co do Leszke to w końcu noblista, dalej czekam, aż ktoś rozszyfruje ukryte przed nami znaczenie jego masońskich wpisów - to nie może być dzieło przypadków ( ͡° ͜ʖ ͡°)
tak z ciekawości pytam, qt bardzo mi się podoba, kilka lat temu robiłem większy projekt w Qt4 i bardzo mnie urzekł przemyślaną konstrukcją i kompletem narzędzi do wszystkiego na wszystkie systemy :)
Na studiach miałem jakiś przedmiot gdzie na zaliczenie wziąłem projekt w Qt - prezentację wyników pomiarowych na raspberrypi.
W wersji 5.0 i wyżej doszło wiele fajnych dodatków np. Qserial do portów szeregowych i np. Obsługi magistrali CAN.
Takie zestawienie jak tu opisałem jest wygodniejsze i szybsze niż
Mam taką refleksję:
- najpierw były zwykłe programy (natywne)
- potem zaczęliśmy się przenosić na przeglądarki (wszystko przez WWW)
- następny etap to znowu natywne programy: zamiast strony WWW meteo.pl jest apka na smartfona
- teraz znowu widzę tendencję: wypchnijmy wszystko na wyższą warstwę, będzie działać na wszystkim...
Ile jeszcze takich cykli