ÍNDICE DE CONTEÚDO
- Beaglebone Black + Qt Embedded + Yocto – parte 1
- Beaglebone Black + Qt Embedded + Yocto – parte 2
Na primeira parte da série vimos como configurar o ambiente e gerar uma distribuição Linux Embarcado para Beaglebone Black com Qt Embedded e Yocto Project.
Agora vamos aprender como gerar e configurar as ferramentas necessárias para o desenvolvimento de aplicações Qt que serão executadas no nosso target, a Beaglebone Black. Basicamente precisaremos de uma toolchain contendo os utilitários e bibliotecas para podermos “cross-compilar” as aplicações desenvolvidas através da IDE Qt Creator.
Gerando a Toolchain
É importante que você tenha realizado todos passos descritos no primeiro artigo da série. Para gerarmos a toolchain devemos carregar as variáveis de ambiente do Yocto e instruí-lo a construir a toolchain para o Qt Embedded.
1 2 3 |
cd ~/yocto . poky-dora/oe-init-build-env build-dora bitbake meta-toolchain-qte |
O instalador da toolchain gerado está disponível em:
~/yocto/build-dora/tmp/deploy/sdk/
e serve tanto para construção de aplicações Qt Embedded quanto para aplicações Linux que não utilizam o Qt.
Instalando a Toolchain
Vamos executar o script com a opção de instalação no caminho padrão sugerido.
1 2 3 4 5 |
# Para Host Linux 64bits ~/yocto/build-dora/tmp/deploy/sdk/poky-eglibc-x86_64-meta-toolchain-qte-armv7a-vfp-neon-toolchain-qte-1.5.1.sh # Para Host Linux 32bits ~/yocto/build-dora/tmp/deploy/sdk/poky-eglibc-x86-meta-toolchain-qte-armv7a-vfp-neon-toolchain-qte-1.5.1.sh |
Após a instalação nossa toolchain estará disponível em: /opt/poky/1.5.1/
.
Instalando o Qt Creator
Vamos baixar a versão 3.0.1 e instala-lá utilizando as opções padrão sugeridas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Para Host Linux 64bits: wget https://download.qt-project.org/official_releases/qtcreator/3.0/3.0.1/qt-creator-opensource-linux-x86_64-3.0.1.run -P ~/Downloads # Para Host Linux 32bits: wget https://download.qt-project.org/official_releases/qtcreator/3.0/3.0.1/qt-creator-opensource-linux-x86-3.0.1.run -P ~/Downloads # Executando o Instalador # Host 64bits chmod +x ~/Downloads/qt-creator-opensource-linux-x86_64-3.0.1.run ~/Downloads/qt-creator-opensource-linux-x86_64-3.0.1.run # Host 32bits chmod +x ~/Downloads/qt-creator-opensource-linux-x86-3.0.1.run ~/Downloads/qt-creator-opensource-linux-x86-3.0.1.run |
Configurando o Qt Creator
Vamos realizar as configurações necessárias para que o Qt Creator utilize a toolchain que geramos. Feche o programa caso ele esteja aberto.
A primeira coisa a ser feita é adicionar as variáveis de ambiente da toolchain no script de inicialização do Qt Creator. Para isso adicione o conteúdo abaixo na primeira linha do arquivo ~/qtcreator-3.0.1/bin/qtcreator.sh.
1 |
source /opt/poky/1.5.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi |
O resultado final do arquivo ~/qtcreator-3.0.1/bin/qtcreator.sh.
deve ser:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
source /opt/poky/1.5.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi #! /bin/sh makeAbsolute() { case $1 in /*) # already absolute, return it echo "$1" ;; *) # relative, prepend $2 made absolute echo `makeAbsolute "$2" "$PWD"`/"$1" | sed 's,/\.$,,' ;; esac } me=`which "$0"` # Search $PATH if necessary if test -L "$me"; then # Try readlink(1) readlink=`type readlink 2>/dev/null` || readlink= if test -n "$readlink"; then # We have readlink(1), so we can use it. Assuming GNU readlink (for -f). me=`readlink -nf "$me"` else # No readlink(1), so let's try ls -l me=`ls -l "$me" | sed 's/^.*-> //'` base=`dirname "$me"` me=`makeAbsolute "$me" "$base"` fi fi bindir=`dirname "$me"` libdir=`cd "$bindir/../lib" ; pwd` LD_LIBRARY_PATH=$libdir:$libdir/qtcreator${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} export LD_LIBRARY_PATH |
Agora vamos executar o Qt Creator. É importante dizer que SEMPRE que formos abrir o programa utilizaremos o comando abaixo, caso contrário o Qt Creator não funcionará corretamente com a toolchain gerada:
1 |
~/qtcreator-3.0.1/bin/qtcreator.sh |
A figura abaixo mostra a tela inicial do aplicativo:
Agora vamos criar um Kit contendo as informações do nosso target (Beaglebone Black) e da nossa toolchain. Siga os passos descritos abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
1) Menu "Tools"-> Submenu "Options" 2) Opção "Build & Run" -> Aba "Compilers" ->Botão "Add" -> Opção "GCC" Name: Poky G++ -> Apply Compiler path: /opt/poky/1.5.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ Botão "Apply" 3) Opção "Build & Run" -> Aba "Debuggers" -> Botão "Add" Name: Poky GDB Path: /opt/poky/1.5.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb Botão "Apply" 4) Opção "Build & Run" -> Aba "Qt Versions" -> Botão "Add" Filename: /opt/poky/1.5.1/sysroots/x86_64-pokysdk-linux/usr/bin/qmake Version Name: Qt 4.8.5 (Embedded) Botão "Apply" 5) Opção "Build & Run" -> Aba "Kits" -> Botão "Add" Name: BBB Device Type: Generic Linux Device Sysroot: /opt/poky/1.5.1/sysroots/armv7a-vfp-neon-poky-linux-gnueabi Compiler: Poky G++ Debugger: Poky GDB Qt Version: Qt 4.8.5 (Embedded) Botão "Make Default" Botão "OK" |
Ao final desses procedimentos devemos ter a tela de configuração das opções “Build & Run” semelhante a essa:
Compilando uma aplicação
Como não poderia deixar de ser, vamos criar uma aplicação “Hello World”. Execute os seguintes comandos no shell:
1 2 3 |
mkdir ~/qte-helloworld echo -e 'TEMPLATE = app\nTARGET = helloword\nQT = core gui\ngreaterThan(QT_MAJOR_VERSION, 4): QT += widgets\nSOURCES += main.cpp' > qte-hello-world/helloworld.pro echo -e '#include <QApplication>\n#include <QPushButton>\n\nint main(int argc, char **argv){\n QApplication app (argc, argv);\n QPushButton button ("Hello world !");\n button.show();\n return app.exec();\n}' > qte-helloworld/main.cpp |
Teremos um arquivo de projeto ~/qte-helloworld/helloworld.pro
:
1 2 3 4 5 |
TEMPLATE = app TARGET = helloword QT = core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets SOURCES += main.cpp |
E um código fonte da aplicação ~/qte-helloworld/main.cpp
:
1 2 3 4 5 6 7 8 9 |
#include <QApplication> #include <QPushButton> int main(int argc, char **argv){ QApplication app (argc, argv); QPushButton button ("Hello world !"); button.show(); return app.exec(); } |
Vamos importar nosso projeto para dentro do Qt Creator. Para isso, vá em “File” -> “Open File or Project”, e selecione o arquivo ~/qte-helloworld/helloworld.pro
.
Na próxima tela aparecerá qual Kit deverá ser utilizado, se você marcou o Kit BBB como default (“Make Default”) na seção anterior ele já estará selecionado. Para finalizar clique em “Configure Project”.
Agora vamos construir a aplicação em “Build” -> “Build Project helloworld”
Testando a aplicação
Copie o binário gerado pelo Qt Creator em ~/build-helloworld-BBB-Debug/helloword
para a raíz de um pendrive.
Insira o pendrive na BBB, plugue um cabo conversor USB Serial e abra uma conexão serial.
Insira o microSD card gerado na primeira parte dessa série, conecte a BBB a uma TV através de uma cabo HDMI, conecte o pendrive com o binário gerado e energize a placa, logue como root e execute os seguintes comandos:
1 2 3 |
/etc/init.d/qtdemo stop mount /dev/sda1 /media /media/helloworld -qws |
Note que rodamos a aplicação com os parâmetros “-qws”, isso indica ao Qt que ele deve rodar no modo embedded e usar o seu gerenciador de janela interno.
A TV ficará com a seguinte imagem:
Conclusão
Com as partes 1 e 2 desse tutorial é possível gerar uma distribuição Linux embarcado customizado usando o Qt Embedded e desenvolver aplicações sem muitas complicações.
Se você é novato no mundo de programação Qt, sugiro que dê uma lida no material Qt for beginners.
Hi Diego, I successfully build the meta-toolchain-qt5 SDK using this command : bitbake meta-toolchain-qt5 I follow your instruction to setup QtCreator but I’m not able to compile, I’m getting this error : “c command not found”. So I guest there something broken in setup environment. I have took a look to setup environment file in “/opt/poky/1.6.2/environment-setup-cortexa8t2hf-vfp-neon-poky-linux-gnueabi” and then I did not see any OE_QMAKE environment variable set, this is not normal ? If I well understand, in “meta-embarcados/classes/populate_sdk_qt5”, should append the setup environment variable that are missing. But here is what I have in the file “/opt/poky/1.6.2/environment-setup-cortexa8t2hf-vfp-neon-poky-linux-gnueabi” https://pastebin.com/8uvwVcmP I do… Leia mais »
Yessss, I got it 🙂
I have to this line also to the “qtcreator.sh”
$ source /opt/poky/1.6.2/sysroots/x86_64-pokysdk-linux/environment-setup.d/qt5.sh
Muito bom, rodou redondinho.
Abraço
Eduardo Scherrer
Olá Eduardo,
Dessa vez conferi os passos umas 3 vezes. hehehehe
Obrigado por testar.
Abraços