Kompilace Qt5 pro Raspberry Pi

Posted by Petr Hapal on 12 December 2016 | 0 Comments

Tags: , ,

Qt je skvělý a jednoduše použitelný multiplatformní C++ framework. Raspberry Pi je perfektní a široce používaný kousek hardwaru. V tomto příspěvku bych chtěl ukázat, jak spojit tyto dvě technologie - zkompilovat Qt5 pro Raspberry Pi ze zdrojových kódů. V některém z následujících příspěvků také ukážu, jak nastavit QtCreator pro vzdálené ladění na Raspberry Pi.

Toolchain pro křížový překlad

Základní myšlenka je jednoduchá - použít standarní PC s Linuxem a QtCreatorem pro vývoj. Pro tento účel je zapotřebí toolchain s křížový překladačem, který bude fungovat na platformě x64 nebo .i686 a překládat pro platformu ARMv6. Takový toolchain (založený na GCC) lze sestavit ze zdrojových kódů využitím napr. crosstool-ng. Je nicméně možné a jednodušší využít předem sestaveného toolchainu v binární podobě, který je na Internetu k dispozici.

Poznámka: Následující postup byl vyzkoušen na čisté instalaci systému Fedora 25 x64 bežícím ve VirtualBoxu. Samozřejmě můžete použít vaši oblíbenou distibuci.

Začněme stažením toolchainu. Naklonujeme git repozitář z githubu.

git clone https://github.com/raspberrypi/tools.git

Svůj toolchain chci umístit do adresáře /opt/raspi_toolchain. Vytvořme jej a nastavme práva

sudo mkdir /opt/raspi_toolchain
sudo chmod 0777 /opt/raspi_toolchain

A zkopírujme jej do vytvořeného adresáře

cp -a tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/* /opt/raspi_toolchain

Raspberry Pi root file systém

Pro sestavování našich aplikací je zapotřebí i cílový root file systém. Root file systém obsahuje všechny nutné hlavičkové soubory a knihovny. V podstatě je to obsah ext4 oddílu Raspberry Pi micro SD karty. Aby bylo možné vyvíjet Qt aplikaci bez nutnosti mít micro SD kartu stále namountovanou do systému zkopírujeme obsah karty do lokálního adresáře. Zvolil jsem adresář /opt/raspi_rootfs. Namountujeme souborový systém (ext4 na micro SD kartě je v mém případě /dev/sdb2) a zkopítujeme obsah do /opt/raspi_rootfs.

Poznámka: Pro Raspberry Pi používám archlinuxarm pro svoji lehkost a rychlé bootování. Pro instalaci následujte postup, který je popsán zde: https://archlinuxarm.org/platforms/armv6/raspberry-pi.

mkdir /tmp/rootfs
sudo mount /dev/sdb2 /tmp/rootfs

sudo mkdir /opt/raspi_rootfs
sudo chmod 0777 /opt/raspi_rootfs

sudo cp -a /tmp/rootfs/* /opt/raspi_rootfs

Nyní máme připraveno vše potřebné pro sestavení Qt5.

Sestavení Qt5

Stáhneme a rozbalíme zdrojové kódy Qt

wget http://download.qt.io/official_releases/qt/5.7/5.7.0/single/qt-everywhere-opensource-src-5.7.0.tar.gz
tar -xvf qt-everywhere-opensource-src-5.7.0.tar.gz
cd qt-everywhere-opensource-src-5.7.0

Teď následuje důležitý krok - konfigurace Qt. To může být trochu komplikované, ale následující konfigurace se mi zdá vhodná a je funkční. Qt se sestaví a qmake se umístí do /opt/qt5pi a všechny knihovny a hlavičkové soubory do /opt/raspi_rootfs/opt/qt5pi. Je důležité, aby konfigurace proběhla do konce a bez chyby.

./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=/opt/raspi_toolchain/bin/arm-linux-gnueabihf- -opensource -confirm-license -optimized-qmake -reduced-exports -nomake examples -nomake tests -make libs -sysroot /opt/raspi_rootfs -hostprefix /opt/qt5pi -prefix /opt/qt5pi

Nyní můžeme spustit kompilaci, dát si velmi dlouhou pauzu na kávu nebo oběd a poté nainstalovat sestavené Qt.

gmake
sudo gmake install

Pokud vše proběhne bez chyb máme Qt5 připraveno v lokální kopii root file systému. Je nutné zkopírovat vše co přibylo na micro SD kartu, aby bylo možné spouštět na Raspbery Pi vytvořené Qt aplikace

sudo cp -an /opt/raspi_rootfs/* /tmp/rootfs
sync
sudo umount /dev/sdb2

Konfigurace QtCreatoru

Následující kroky jsou nutné pro funkční křížový překlad a ladění pomocí QtCreatoru pro Raspberry Pi. Nejprve vytvoříme nové zařízení. V hlavní nabídce zvolte Toos -> Options a poté klikněte na Devices. Klikněte na tlačítko Add, zvolte "Generic Linux Device" a klikněte na tlačítko Start Wizard. V zobrazeném dialogu vyplňte jméno, IP adresu a autentifikační údaje (předpokládám, že IP addresa Raspberry Pi je 192.168.1.199). Mělo by to vypadat asi takto (na závěr klikněte na tlačítko Apply):

Pokračujeme definicí nového překladače (náš toolchain s křížovým překladačem v /opt/raspi_toolchain). Klikněte na Build & Run a zvolte záložku Compilers. Klikněte na tlačítko Add a vyberte GCC. Vyplňte název a cestu k překladači (na závěr klikněte na tlačítko Apply):

Následuje přidání nové verze Qt (té, kterou jsme sestavili). Zvolte záložku Qt Versions a klikněte na tlačítko Add. Objeví se dialog pro otevření souboru - vyhledejte qmake, který by měl být v adresáři /opt/qt5pi/bin a klikněte na OK. Můžete také změnit název překladače (na závěr klikněte na tlačítko Apply):

Na závěr přidáme nový kit. Zvolte záložku Kits a klikněte na tlačítko Add. Vyplňte název, Device type nastavte na Generic Linux Device a vyberte zařízení, které jsme před chvílí vytvořili. Překladač je nutné nastavit na námi definovaný Raspberry Pi GCC překladač a Qt verze na verzi, kterou jsme vytvořili. Melo by to vypadat asi takto (na závěr klikněte na tlačítko Apply):

Klikněte na tlačítko OK. V této chvíli je vše nastaveno a připraveno k použití.

Ukázkový projekt v QtCreatoru

Založíme nový projekt kliknutím na File -> New File or Project v hlavní nabídce. Zvolte Application, Qt Console Application a klikněte na tlačítko Choose. Zvolte název projektu a jeho umístění a klikněte na tlačítko Next. V následující dialogu zaškrtněte Raspberry Pi kit a odskrtněte Desktop (samozřejmě je možné mít zvoleny oba kity a přepínat mezi nimi před sestavením). Klikněte na tlačítko Next a Finish.

Projekt je připraven. Vytvořme novou třídu Task s nejakým výpisem na standardní výstup.

task.h

#ifndef TASK_H
#define TASK_H

#include <QObject>

class Task : public QObject
{
    Q_OBJECT
public:
    explicit Task(QObject *parent = 0);

public slots:
    void run();

signals:
    void finished();
};

#endif // TASK_H

task.cpp

#include "task.h"
#include <iostream>

using namespace std;

Task::Task(QObject *parent) : QObject(parent)
{

}

void Task::run()
{
    cout << "Hello world from Qt" << endl;
    emit finished();
}

main.cpp

#include <QCoreApplication>
#include <QTimer>
#include "task.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Task *task = new Task(&a);

    QObject::connect(task, SIGNAL(finished()),
                     &a, SLOT(quit()));

    QTimer::singleShot(0, task, SLOT(run()));

    return a.exec();
}

Klikněte na Build -> Build all a mělo by dojít k sestavení spustitelného binárního souboru. Ten nakopírujeme na micro SD kartu, vložíme ji do Raspberry Pi, nabootujeme, zalogujeme se a program spustíme. Do terminálu by se mělo vypsat "Hello world from Qt".

[root@alarmpi ~]# ./test
Hello world from Qt

 

Zaslat komentář

Komentáře

Nikdo na této stránce ještě nepřidal komentář.

RSS kanál pro komentáře na této stránce | RSS kanál pro všechny komentáře