Desenvolvendo com o Qt Creator em Linux embarcado

- por Sergio Prado

Categorias: Beagleboard-xM, Linux Tags: , , , ,

Um tempo atrás escrevi um artigo sobre o desenvolvimento com Qt em Linux embarcado, mas não cheguei a tratar do Qt Creator.

O Qt Creator é uma IDE completa e multi-plataforma para desenvolvimento em Qt, com suporte total à design de interface gráfica. Sim, com ela você consegue desenvolver uma aplicação gráfica em Qt, criando janelas e arrastando botões e campos de texto! Simples assim!

Para desenvolvimento nativo, ela é plug’n play. Ou seja, basta baixar e usar. Já para desenvolvimento em Linux embarcado, você precisará de um ambiente configurado e de alguns ajustes na ferramenta. É o que veremos neste artigo.

PREPARANDO O TERRENO

O kit de desenvolvimento (target) que usaremos para os testes será a Beagleboard-xM, mas o mesmo processo deve funcionar em qualquer outra plataforma.

Para começar, você vai precisar de um toolchain. Não sabe o que é um toolchain? Então você deve ler o artigo “Desmistificando toolchains em Linux embarcado“.

Porque precisamos de um toolchain? Porque iremos cross-compilar as bibliotecas do Qt para o kit de desenvolvimento.

Então como eu consigo um toolchain, Sergio? Fácil, já respondi esta pergunta para você no artigo “Gerando e usando toolchains em Linux embarcado“.

Meu conselho é você usar o toolchain da CodeSourcery ou gerar um toolchain para ARM genérico com a glibc. Prometo que isso irá evitar muita dor de cabeça e algumas noites mal dormidas.

Digo isso porque já tive alguns problemas tentando compilar o Qt manualmente com um toolchain baseado na uClibc. Mas se você quer insistir nessa idéia, sugiro usar o Buildroot para compilar o Qt. Ele usa uma versão mais antiga do Qt, e já possui todos os patches para compilar sem problemas com um toolchain baseado na uClibc. À propósito, já expliquei como fazer isso no artigo “Compilando Qt e aplicações gráficas em Linux embarcado“.

Com o toolchain preparado, mãos à obra!

COMPILANDO O QT

O primeiro passo é baixar e compilar as bibliotecas do Qt. Esse processo vai lhe exigir muita paciência e algumas xícaras de café.

Para baixar e extrair os fontes do Qt:

$ wget http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.1.tar.gz
$ tar zxfv qt-everywhere-opensource-src-4.8.1.tar.gz
$ cd qt-everywhere-opensource-src-4.8.1

Antes de compilar, vamos setar a variável de ambiente PATH para que possamos usar as ferramentas do toolchain (ajuste de acordo com a localização do seu toolchain):

$ export PATH=/opt/toolchain/arm-linux/bin:$PATH

Agora vamos configurar o Qt:

$ ./configure -opensource -confirm-license -embedded arm -xplatform qws/linux-arm-g++ -little-endian -qt-zlib -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -prefix /usr/local/qt-arm

Esta configuração irá preparar o Qt para ser compilado para um sistema ARM little-endian, cujo cross-compiler tem o prefixo arm-linux-. Se sua plataforma for diferente desta configuração, precisará alterar a opção -xplatform.

Se o toolchain que você esta usando não é o mesmo toolchain que gerou o rootfs do seu kit de desenvolvimento, sugiro incluir no comando acima a opção “-static” (sem os parênteses). Se você esta em dúvida, ou não faz a menor idéia do que eu quiz dizer, use-o mesmo assim.

Depois de configurado é só compilar. Prepare-se, porque vai levar (literalmente) algumas horas. Faça isso à noite. Digite o comando abaixo, e até amanhã…

$ make

Bom dia! Agora mais alguns minutos para instalar:

$ sudo make install

Agora é só copiar as bibliotecas para o kit de desenvolvimento. Este procedimento vai depender bastante de como você montou o seu rootfs. Se estiver em uma memória flash, você vai precisar de uma ferramenta de rede como o scp para copiar os arquivos. Se estiver em um cartão SD, basta copiar para o cartão. Mas se você for mesmo esperto, terá montado seu rootfs via NFS (o rootfs fica disponibilizado localmente na sua máquina, e é acessado remotamente via rede pelo kit de desenvolvimento).

Mas Sergio, eu não sei como montar um rootfs via NFS. Vai me dizer que você também escreveu um artigo sobre isso? Sim, escrevi. Como adivinhou? :) É só acessar o artigo “Montando o rootfs no Linux via NFS“. Não se esqueça de adaptar os parâmetros para o seu target (kit de desenvolvimento).

Com o rootfs disponível localmente e montado via NFS, basta copiar as bibliotecas do Qt. Para fins didáticos, vou considerar que o meu rootfs encontra-se no diretório /mnt/rootfs (ajuste de acordo com o seu):

$ sudo mkdir -p /mnt/rootfs/usr/local/qt-arm/
$ sudo cp -av /usr/local/qt-arm/lib /mnt/usr/local/qt-arm/

Como as bibliotecas do Qt foram instaladas em um diretório que não é padrão no Linux, precisamos incluir seu caminho na variável de ambiente LD_LIBRARY_PATH. Coloque a linha abaixo no arquivo /etc/profile do target e reinicie-o:

export LD_LIBRARY_PATH=/usr/local/qt-arm/lib:$LD_LIBRARY_PATH

Você pode testar a instalação do Qt escrevendo uma aplicação simples. Dá uma olhada novamente neste artigo aqui.

INSTALANDO E CONFIGURANDO O QT CREATOR

A versão do Qt Creator que usaremos aqui é a 2.2.1. Para instalá-lo, basta usar o gerenciador de pacotes da sua distribuição. No Ubuntu, execute o comando abaixo:

$ sudo apt-get install qtcreator

Agora vamos configurá-lo para cross-compilar nossa aplicação. O primeiro passo é configurar o qmake, o gerenciador do sistema de build do Qt:

  1. Abra o Qt Creator e acesse o menu “Tools -> Options -> Qt4“.
  2. Clique em “Add“.
  3. Configure o campo “Version” com “Beagleboard Qt 4.8.1“.
  4. Configure o campo “qmake location” com o local de instalação do qmake, que no nosso caso é “/usr/local/qt-arm/bin/qmake“.
  5. Clique em “OK“.

Agora vamos configurar o toolchain:

  1. Acesse o menu “Tools -> Options -> Tool Chains“.
  2. Clique em “Add
  3. Configure o caminho completo do compilador C++ e do GDB do seu toolchain conforme a imagem abaixo.
  4. Clique em “OK“.

Agora vamos criar um projeto para testar:

  1. Acesse o menu “File -> New File“.
  2. Selecione a opção “Project -> Qt Widget Project -> Qt GUI Application“.
  3. Clique em “Choose…“, dê um nome para seu projeto e confirme o restante das opções até o “Finish“.

Agora vamos configurar o projeto para usar as ferramentas de cross-compilação:

  1. Selecionar “Projects” à esquerda.
  2. Configurar o campo “Qt Version” com “Beagleboard Qt 4.8.1“.

Agora é só desenvolver! À propósito, arrastar e alinhar botões e labels me trouxeram boas lembranças do saudoso Delphi… :)

Salve e compile. Será gerado um binário com o mesmo nome do projeto. Copie o binário para o target e execute-o (lembre-se de passar o parâmetro -qws):

$ /usr/sbin/qt_beagle -qws

Fácil, não? :) Agora não tem desculpa para não desenvolver aplicações gráficas facilmente em Linux embarcado!

Até a próxima!

Um abraço,

Sergio Prado

  • Marcelo Jo

    Putz Sérgio! Vc é meu mestre! =D Um dia com esforço e dedicação eu chegarei lá! Parabéns novamente por mais um ótimo post!
    Abraços

  • Cleitonrbueno

    Criar GUI com Qt em Linux é show de bola, ainda mais que tem como você integrar o Qt com Python fica mais show de bola ainda.
    Gosto muito do Glade também mas ae é para trabalhar com o Python, que a cada dia me surpreende mais esta excelente linguagem, e no caso uso para comunicar com Serial, USB e Rede.

  • Scardini

    Olá Sergio,

    Sou desenvolvedor a muitos e muitos anos, sempre trabalhei com automação e muitas vezes com linguagens de baixo nível. Embora já trabalhei bastante desenvolvendo para linux, só agora tenho entrado no mundo de software embarcado.  Adquiri recentemente uma SBC da FriendlyARM, a Tiny210 ( arm cortex A8 1Ghz ) … Estou muito satisfeito com a aquisição e tenho me divertindo bastante instalando o Debian nela, e desenvolvendo algumas aplicações.

    Como interface gráfica estou usando o Xfce. Me corrija se eu estiver errado, mas em algumas pesquisas eu entendi que com o Qt é possivel colocar um aplicação diretamente em cima do Qt, sem a necessidade de uma “desktop manager” por baixo. Ou seja, criar um aplicação visual utilizando o Qt em modo full screen sem nenhuma outra aplicação ou utilitário disponíveis ao usuário. Correto?

    Se isto está correto fica a sugestão de um novo post mostrando como efetuar isto, acho que seria de muita ajuda a muitos novatos, e para alguns macacos velhos tb! ;)

    Parabéns pelo excelente material publicado!

    scardini

    • Olá Scardini!

      Sim, é possível! E é exatamente isso que eu fiz neste post. Não tenho nenhum servidor gráfico ou window manager rodando. É uma aplicação Qt rodando direto em cima do framebuffer.

      Um abraço.

  • Alexandre Nardelli

    Olá Sérgio
     Parabéns muito bom trabalho.
    Vc por acaso teria um link ou download de um QT_embedded e toolchain para a placa :
    SBC6000X
    http://www.embedinfo.com/english/Product/sbc6000x.asp
    da Embest.

    Parabéns novamente, e muito obrigado pela atenção.

  • Alexandre Nardelli

     Olá Sérgio
    Obrigado pela pronta resposta.
    O toolchain que veio no cdrom da placa funciona no terminal, compila os programas exemplo que vieram com a placa (sbc6000x), mas o QT_creator continua a colocar um sinal vermelho de falta do toolchain, em anexo imagens.
    Onde poderia estar o erro pois ele aceita o qmake mas não o toolchain que funciona no prompt?
    obs. retirei varias opções no ./configure da QT para retirar erros:
    ./configure -opensource -confirm-license -embedded arm -little-endian -no-webkit -fast -no-largefile -nomake examples -nomake demos -silent -no-stl -no-freetype -no-opengl -qt-zlib -qt-libjpeg -qt-libtiff -qt-libpng -no-openssl -no-javascript-jit -xplatform qws/linux-arm-g++ -no-scripttools -no-script -nomake translations

    • Olá Alexandre,

      Pelo erro, o Qt foi compilado com um toolchain diferente do configurado para compilar a aplicação. Você usou este toolchain para compilar o Qt?

      • Alexandre Nardelli

         Sim, acho que sim, mas vou refazer tudo novamente.

        • Alexandre Nardelli

           Olá Sérgio
          Adquirimos outro kit que veio c/Qt 4.4.2, mas sem os codigos fontes do exemplo para Qt.
          Parece que vc tinha razão, para esta nova placa consegui conpilar, no Qtcreator ficou um sinal amarelo, dizendo que não tem QML na compilação, mas compilou um programa.

          Estou agora com o seguite problema após carregar o rootfs que veio com a placa: (rfs.yaffs2 sem a QT):
          “Warning: unable to open an initial console.”e o linux não prossegue.o outro (rfs-qtopia_sbc6345.yaffs2) funciona.Tem alguma sugestão ?
          Obrigado pela atenção.

          • Olá Alexandre,

            Este erro acontece quando o kernel não consegue carregar a aplicação init (normalmente /sbin/init). Seu rootfs pode estar corrompido, ou não foi gravado corretamente na flash.

            Um abraço.

  • Renne

    Olá Sergio, tentei fazer os passos do tutorial e na hora do “make” ele para e da a mensagem: 
    .obj/release-shared-emb-arm/qtconcurrentiteratekernel.o: In function `getticks()’:qtconcurrentiteratekernel.cpp:(.text+0x3c): undefined reference to `clock_gettime’collect2: ld returned 1 exit statusmake[1]: *** [../../lib/libQtCore.so.4.8.1] Error 1make[1]: Leaving directory `/home/user/placa/qt-everywhere-opensource-src-4.8.1/src/corelib’make: *** [sub-corelib-make_default-ordered] Error 2

    O você tem alguma dica do que pode ser?

    • Olá Renne,

      Me parece um problema com o toolchain. Qual toochain esta usando?

      • Renne

        Olá Sergio, eu verifiquei aqui e era uma configuração no g++.conf, eu arrumei e ficou desse jeito:

        # modifications to g++.confQMAKE_CC                = arm-none-linux-gnueabi-gccQMAKE_CXX               = arm-none-linux-gnueabi-g++QMAKE_LINK              = arm-none-linux-gnueabi-g++QMAKE_LINK_SHLIB        = arm-none-linux-gnueabi-g++# modifications to linux.confQMAKE_AR                = arm-none-linux-gnueabi-ar cqsQMAKE_OBJCOPY           = arm-none-linux-gnueabi-objcopyQMAKE_STRIP             = arm-none-linux-gnueabi-stripQMAKE_RANLIB            = arm-none-linux-gnueabi-ranlib

        como root eu fiz o configure ; make ; make install,
        deu certinho.
        Obrigado pela atenção.
        Renne Takao

  • boa Tarde Sergio, Veja se pode me dar uma orientaçao, utilizo um equipamento de video, DVR, o sistema dele é linux gravado em uma eprom , preciso editar esse sistema já existente para adicionar alguns recursos, você tem conhecimento disso pelo menos para me dar uma luz por onde eu devo seguir para conseguir isto?
    Grato

    • Eu passei por algo semelhante.
      No caso eu precisava descobrir a senha do root e não quebrá-la e alterar um arquivo .conf porem quando desligasse queria que voltasse alterado e não original.

      Bom depois de várias pesquisar minha solução foi ter em mãos o firmware do dispositivo ae usando binwalk e conhecimentos em linux (dd, mount, ldd, chroot, John The Ripper e outras ferramentas) foi possível a descoberta e alteração da imagem e em seguida a imagem alterada foi regravada no dispositivo.

      Esse pelo menos foi o método resolvi este problema.

    • Olá Roberto,

      A idéia do Cleiton é boa. O primeiro passo é extrair o firmware da memória flash do equipamento. Depois você pode passar nele o binwalk para tentar extrair o rootfs.

      Um abraço.

    • Valeu pessoal.

  • Paulo

    Viva Sérgio. Parabéns pelo trabalho! Segui os seus passos com umas ajudas extra e já consigo utilizar o qt creator para desenvolver aplicaçoes e correr no meu friendlyarm tiny6410. Acontece que tenho um problema: no meu host faço uma janela toda “bonitinha” mas quando corro no target o tipo da letra altera-se completamente ficando mto pequeno. Saberá qual pode ser o problema? Outra coisa: vejo videos de mini/tiny com bons gráficos e o meu está longe de obter gráficos tãp bons. Alguma sugestão??

    Obrigado

    • Olá Paulo!

      As fontes do Qt estão instaladas no target? Com relação aos gráficos, pode ser a qualidade do display que esta usando.

      Um abraço.

  • André Bisinoto Matias

    Olá, Sérgio

    Parabéns pelo artigo e pelo blog: estão sendo muito úteis para mim.

    Estou enfrentando a seguinte situação:

    se eu crosscompilo o Qt para a Beaglebone usando o parâmetro ‘-static’ no configure, a aplicação que estou deenvolvendo roda normalmente.

    Se, ao contrário, uso o parâmetro ‘-shared’, a aplicação não encontra as libs do Qt (apesar de corretamente alocadas e listadas no LD_LIBRARY_PATH).

    Após muito pesquisar, acho que este problema pode estar relacionado com o que vc disse neste post:

    “Se o tool­chain que você esta usando não é o mesmo tool­chain que gerou o rootfs do seu kit de desen­volvi­mento, sugiro incluir no comando acima a opção “–sta­tic” (sem os parên­te­ses). Se você esta em dúvida, ou não faz a menor idéia do que eu quiz dizer, use-o mesmo assim.”

    Meu rootfs é o Debian wheezy, que eu baixei segundo o link http://www.eewiki.net/display/linuxonarm/BeagleBone#BeagleBone-DebianWheezy%28snapshot%29%28armhfbased%29RootFileSystem

    Qual seria a melhor saída? Gerar o rootfs a partir do meu toolchain?

    Obrigado!
    André

    • Olá André,

      Sim, neste caso você precisaria usar um rootfs gerado pelo seu toolchain.

  • hair

    amigao muito ..mas nao consigo fazer rodar um projeto ja feito …eu achei na net um projeto de um player bem legal mas quando vou tentar editar o arquivo player.PRO nao consigo abrir pra editar a interface grafica ….como faco pra editar um projeto pronto obrigado! to aprendendo mas ta dificil.

    • Olá,

      Neste caso acredito ser melhor você ir em um forum especializado em Qt Creator.

      Um abraço.

  • Andre

    Seria possível utilizar o Qt para criar interfaces gráficas para sistemas sem linux embarcado?

  • Henry Fabricio (Seva)

    Sérgio, obrigado pelas informações. Tentei este procedimento para o Qt 5.4.0 mas ele dá 3 erros no comando configure. Você sabe se os comandos mudaram?
    -embedded: invalid command-line switch
    -qt-libtiff: invalid command-line switch
    -qt-libmng: invalid command-line switch

    Obrigado.

    • Olá Henry,

      Para compilar o Qt5 o procedimento é bem diferente. Para esta tarefa, em vez de fazer manualmente, sugiro você usar uma ferramenta de build como o Buildroot ou o Yocto.

      Um abraço.

  • Raphael

    Olá Sérgio, rodei o comando make para o qt 4.8.1, e após um longo tempo apareceu o seguinte erro:

    make[2]: ** [.obj/release-static-emb-arm/SVGStyledLocatableElement.o] Erro 1

    make[2]: Saindo do diretório `/home/raphael/qt/qt-everywhere-opensource-src-4.8.1/src/3rdparty/webkit/Source/WebCore’

    make[1]: ** [sub-WebCore-make_default-ordered] Erro 2

    make[1]: Saindo do diretório `/home/raphael/qt/qt-everywhere-opensource-src-4.8.1/src/3rdparty/webkit/Source’

    make: ** [sub-webkit-make_default-ordered] Erro 2

    Não consegui encontrar nada sobre isso, você sabe do que se tratam esses erros?

    Muito Obrigado.

    • Olá Raphael,

      Esta mensagem que me enviou não é muito indicativa. Dá apenas para perceber que o erro está na compilação do webkit. Tente analisar as mensagens que foram exibidas antes destas que você colocou nos comentários. Você deve encontrar a causa do erro. Normalmente é incompatibilidade do toolchain com o Qt.

      Um abraço.

      • Raphael

        Olá Sérgio, obrigado pelo seu retorno. Eu corrigi esse erro inserindo -static na config e compilei novamente, desta vez com êxito. Parabéns pelo seu blog Sérgio.

  • Raphael

    Olá Sérgio, consegui gerar o toochain e compilar o qt, porém quando executo o arquivo binário no target (estou usando raspberry pi) aparece uma sombra do ponteiro do mouse, e conforme eu vou passando o mouse pela tela ele vai preenchendo a área verde com a cor do background, você já viu isso alguma vez? Estou colocando o diretório na variável LD_LIBRARY_PATH, usando o -qws na executação, e executo como super user.
    Muito obrigado .

    • Estranho Raphael. Me parece que a sua aplicação está concorrendo no acesso ao display com outra aplicação (talvez uma aplicação de terminal). Qual distribuição está usando? Raspbian?

      • Raphael

        Isso Sergio estou usando o raspbian, se quiser posso gravar um vídeo para você poder ver melhor o que ocorre? Vou tentar instalar outra distribuição para fazer um teste.

  • King

    Quando vou compilar(make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-), da o seguinte erro, o que pode ser? E como arrumar?
    Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
    /home/king/raspberrypi/linux/kernel/Makefile:141: recipe for target ‘kernel/timeconst.h’ failed
    make[1]: *** [kernel/timeconst.h] Error 255
    Makefile:945: recipe for target ‘kernel’ failed
    make: *** [kernel] Error 2

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.