Desenvolvendo com o Qt Creator em Linux embarcado

- por Sergio Prado

Categorias: Beagleboard, Ferramentas, Linux embarcado Tags: , , , ,

Um tempo atrás escrevi um artigo sobre o desen­volvi­mento com Qt em Linux embar­cado, mas não cheguei a tratar do Qt Cre­ator.

O Qt Cre­ator é uma IDE com­pleta e multi-plataforma para desen­volvi­mento em Qt, com suporte total à design de inter­face grá­fica. Sim, com ela você con­segue desen­volver uma apli­cação grá­fica em Qt, criando janelas e arra­s­tando botões e cam­pos de texto! Sim­ples assim!

Para desen­volvi­mento nativo, ela é plug’n play. Ou seja, basta baixar e usar. Já para desen­volvi­mento em Linux embar­cado, você pre­cis­ará de um ambi­ente con­fig­u­rado e de alguns ajustes na fer­ra­menta. É o que ver­e­mos neste artigo.

PREPARANDO O TERRENO

O kit de desen­volvi­mento (tar­get) que usare­mos para os testes será a Beagleboard-xM, mas o mesmo processo deve fun­cionar em qual­quer outra plataforma.

Para começar, você vai pre­cisar de um tool­chain. Não sabe o que é um tool­chain? Então você deve ler o artigo “Desmisti­f­i­cando tool­chains em Linux embar­cado”.

Porque pre­cisamos de um tool­chain? Porque ire­mos cross-compilar as bib­liote­cas do Qt para o kit de desenvolvimento.

Então como eu con­sigo um tool­chain, Ser­gio? Fácil, já respondi esta per­gunta para você no artigo “Gerando e usando tool­chains em Linux embar­cado”.

Meu con­selho é você usar o tool­chain da CodeS­ourcery ou gerar um tool­chain para ARM genérico com a glibc. Prometo que isso irá evi­tar muita dor de cabeça e algu­mas noites mal dormidas.

Digo isso porque já tive alguns prob­le­mas ten­tando com­pi­lar o Qt man­ual­mente com um tool­chain baseado na uClibc. Mas se você quer insi­s­tir nessa idéia, sugiro usar o Buil­d­root para com­pi­lar o Qt. Ele usa uma ver­são mais antiga do Qt, e já pos­sui todos os patches para com­pi­lar sem prob­le­mas com um tool­chain baseado na uClibc. À propósito, já expliquei como fazer isso no artigo “Com­pi­lando Qt e apli­cações grá­fi­cas em Linux embar­cado”.

Com o tool­chain preparado, mãos à obra!

COMPILANDOQT

O primeiro passo é baixar e com­pi­lar as bib­liote­cas do Qt. Esse processo vai lhe exi­gir muita paciên­cia e algu­mas 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 com­pi­lar, vamos setar a var­iável de ambi­ente PATH para que pos­samos usar as fer­ra­men­tas do tool­chain (ajuste de acordo com a local­iza­ção do seu toolchain):

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

Agora vamos con­fig­u­rar 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 con­fig­u­ração irá preparar o Qt para ser com­pi­lado para um sis­tema ARM little-endian, cujo cross-compiler tem o pre­fixo arm-linux–. Se sua plataforma for difer­ente desta con­fig­u­ração, pre­cis­ará alterar a opção –xplat­formEste link explica mel­hor o processo.

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.

Depois de con­fig­u­rado é só com­pi­lar. Prepare-se, porque vai levar (lit­eral­mente) algu­mas horas. Faça isso à noite. Dig­ite o comando abaixo, e até amanhã…

$ make

Bom dia! Agora mais alguns min­u­tos para instalar:

$ sudo make install

Agora é só copiar as bib­liote­cas para o kit de desen­volvi­mento. Este pro­ced­i­mento vai depen­der bas­tante de como você mon­tou o seu rootfs. Se estiver em uma memória flash, você vai pre­cisar de uma fer­ra­menta 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á mon­tado seu rootfs via NFS (o rootfs fica disponi­bi­lizado local­mente na sua máquina, e é aces­sado remo­ta­mente via rede pelo kit de desenvolvimento).

Mas Ser­gio, eu não sei como mon­tar um rootfs via NFS. Vai me dizer que você tam­bém escreveu um artigo sobre isso? Sim, escrevi. Como adi­v­in­hou? :) É só aces­sar o artigo “Mon­tando o rootfs no Linux via NFS”. Não se esqueça de adap­tar os parâmet­ros para o seu tar­get (kit de desenvolvimento).

Com o rootfs disponível local­mente e mon­tado via NFS, basta copiar as bib­liote­cas do Qt. Para fins didáti­cos, vou con­sid­erar 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 bib­liote­cas do Qt foram insta­l­adas em um diretório que não é padrão no Linux, pre­cisamos incluir seu cam­inho na var­iável de ambi­ente LD_LIBRARY_PATH. Coloque a linha abaixo no arquivo /etc/profile do tar­get e reinicie-o:

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

Você pode tes­tar a insta­lação do Qt escrevendo uma apli­cação sim­ples. Dá uma olhada nova­mente neste artigo aqui.

INSTALANDO E CONFIGURANDO O QT CREATOR

A ver­são do Qt Cre­ator que usare­mos aqui é a 2.2.1. Para instalá-lo, basta usar o geren­ci­ador de pacotes da sua dis­tribuição. No Ubuntu, exe­cute o comando abaixo:

$ sudo apt-get install qtcreator

Agora vamos configurá-lo para cross-compilar nossa apli­cação. O primeiro passo é con­fig­u­rar o qmake, o geren­ci­ador do sis­tema de build do Qt:

  1. Abra o Qt Cre­ator e acesse o menu “Tools -> Options -> Qt4″.
  2. Clique em “Add”.
  3. Con­fig­ure o campo “Ver­sion” com “Bea­gle­board Qt 4.8.1″.
  4. Con­fig­ure o campo “qmake loca­tion” com o local de insta­lação do qmake, que no nosso caso é “/usr/local/qt-arm/bin/qmake”.
  5. Clique em “OK”.

1.qt qmake cfg Desenvolvendo com o Qt Creator em Linux embarcado

Agora vamos con­fig­u­rar o toolchain:

  1. Acesse o menu “Tools -> Options -> Tool Chains”.
  2. Clique em “Add
  3. Con­fig­ure o cam­inho com­pleto do com­pi­lador C++ e do GDB do seu tool­chain con­forme a imagem abaixo.
  4. Clique em “OK”.

2.qt toolchain cfg Desenvolvendo com o Qt Creator em Linux embarcado

Agora vamos criar um pro­jeto para testar:

  1. Acesse o menu “File -> New File”.
  2. Sele­cione a opção “Project -> Qt Wid­get Project -> Qt GUI Appli­ca­tion”.
  3. Clique em “Choose…”, dê um nome para seu pro­jeto e con­firme o restante das opções até o “Fin­ish”.

3.qt new gui app Desenvolvendo com o Qt Creator em Linux embarcado

Agora vamos con­fig­u­rar o pro­jeto para usar as fer­ra­men­tas de cross-compilação:

  1. Sele­cionar “Projects” à esquerda.
  2. Con­fig­u­rar o campo “Qt Ver­sion” com “Bea­gle­board Qt 4.8.1″.

4.qt set build Desenvolvendo com o Qt Creator em Linux embarcado

Agora é só desen­volver! À propósito, arras­tar e alin­har botões e labels me troux­eram boas lem­branças do saudoso Delphi… :)

5.qt ui dev Desenvolvendo com o Qt Creator em Linux embarcado

Salve e com­pile. Será ger­ado um binário com o mesmo nome do pro­jeto. Copie o binário para o tar­get e execute-o (lembre-se de pas­sar o parâmetro –qws):

$ /usr/sbin/qt_beagle -qws

6.qt app test Desenvolvendo com o Qt Creator em Linux embarcado

Fácil, não? :) Agora não tem des­culpa para não desen­volver apli­cações grá­fi­cas facil­mente em Linux embarcado!

Até a próxima!

Um abraço,

Ser­gio Prado

  • Marcelo Jo

    Putz Sér­gio! Vc é meu mestre! =D Um dia com esforço e ded­i­cação eu chegarei lá! Parabéns nova­mente por mais um ótimo post!
    Abraços

  • Cleiton­r­bueno

    Criar GUI com Qt em Linux é show de bola, ainda mais que tem como você inte­grar o Qt com Python fica mais show de bola ainda.
    Gosto muito do Glade tam­bém mas ae é para tra­bal­har com o Python, que a cada dia me sur­preende mais esta exce­lente lin­guagem, e no caso uso para comu­nicar com Ser­ial, USB e Rede.

    • http://sergioprado.org/ Ser­gio Prado

      Valeu pelas dicas Cleiton!

  • Scar­dini

    Olá Ser­gio,

    Sou desen­volve­dor a muitos e muitos anos, sem­pre tra­bal­hei com automação e muitas vezes com lin­gua­gens de baixo nível. Emb­ora já tra­bal­hei bas­tante desen­vol­vendo para linux, só agora tenho entrado no mundo de soft­ware embar­cado.  Adquiri recen­te­mente uma SBC da Friendl­yARM, a Tiny210 ( arm cor­tex A8 1Ghz ) … Estou muito sat­is­feito com a aquisição e tenho me divertindo bas­tante insta­lando o Debian nela, e desen­vol­vendo algu­mas aplicações.

    Como inter­face grá­fica estou usando o Xfce. Me cor­rija se eu estiver errado, mas em algu­mas pesquisas eu entendi que com o Qt é pos­sivel colo­car um apli­cação dire­ta­mente em cima do Qt, sem a neces­si­dade de uma “desk­top man­ager” por baixo. Ou seja, criar um apli­cação visual uti­lizando o Qt em modo full screen sem nen­huma outra apli­cação ou util­itário disponíveis ao usuário. Correto?

    Se isto está cor­reto fica a sug­estão de um novo post mostrando como efe­t­uar isto, acho que seria de muita ajuda a muitos novatos, e para alguns maca­cos vel­hos tb! ;)

    Parabéns pelo exce­lente mate­r­ial publicado!

    scar­dini

    • http://sergioprado.org/ Ser­gio Prado

      Olá Scar­dini!

      Sim, é pos­sível! E é exata­mente isso que eu fiz neste post. Não tenho nen­hum servi­dor grá­fico ou win­dow man­ager rodando. É uma apli­cação Qt rodando direto em cima do framebuffer.

      Um abraço.

  • Alexan­dre Nardelli

    Olá Sér­gio
     Parabéns muito bom tra­balho.
    Vc por acaso teria um link ou down­load de um QT_embedded e tool­chain para a placa :
    SBC6000X
    http://www.embedinfo.com/english/Product/sbc6000x.asp
    da Embest.

    Parabéns nova­mente, e muito obri­gado pela atenção.

  • Alexan­dre Nardelli

     Olá Sér­gio
    Obri­gado pela pronta resposta.
    O tool­chain que veio no cdrom da placa fun­ciona no ter­mi­nal, com­pila os pro­gra­mas exem­plo que vieram com a placa (sbc6000x), mas o QT_creator con­tinua a colo­car um sinal ver­melho de falta do tool­chain, em anexo ima­gens.
    Onde pode­ria estar o erro pois ele aceita o qmake mas não o tool­chain que fun­ciona no prompt?
    obs. retirei varias opções no ./configure da QT para reti­rar erros:
    ./configure –open­source –confirm-license –embed­ded arm –little-endian –no-webkit –fast –no-largefile –nomake exam­ples –nomake demos –silent –no-stl –no-freetype –no-opengl –qt-zlib –qt-libjpeg –qt-libtiff –qt-libpng –no-openssl –no-javascript-jit –xplat­form qws/linux-arm-g++ –no-scripttools –no-script –nomake translations

    • http://sergioprado.org/ Ser­gio Prado

      Olá Alexan­dre,

      Pelo erro, o Qt foi com­pi­lado com um tool­chain difer­ente do con­fig­u­rado para com­pi­lar a apli­cação. Você usou este tool­chain para com­pi­lar o Qt?

      • Alexan­dre Nardelli

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

        • Alexan­dre Nardelli

           Olá Sér­gio
          Adqui­r­i­mos outro kit que veio c/Qt 4.4.2, mas sem os codi­gos fontes do exem­plo para Qt.
          Parece que vc tinha razão, para esta nova placa con­segui con­pilar, no Qtcre­ator ficou um sinal amarelo, dizendo que não tem QML na com­pi­lação, mas com­pi­lou um programa.

          Estou agora com o seguite prob­lema após car­regar o rootfs que veio com a placa: (rfs.yaffs2 sem a QT):
          “Warn­ing: unable to open an ini­tial console.“e o linux não prossegue.o outro (rfs-qtopia_sbc6345.yaffs2) funciona.Tem alguma sug­estão ?
          Obri­gado pela atenção.

          • http://sergioprado.org/ Ser­gio Prado

            Olá Alexan­dre,

            Este erro acon­tece quando o ker­nel não con­segue car­regar a apli­cação init (nor­mal­mente /sbin/init). Seu rootfs pode estar cor­rompido, ou não foi gravado cor­re­ta­mente na flash.

            Um abraço.

  • Renne

    Olá Ser­gio, ten­tei fazer os pas­sos do tuto­r­ial e na hora do “make” ele para e da a men­sagem: 
    .obj/release-shared-emb-arm/qtconcurrentiteratekernel.o: In func­tion ‘getticks()’:qtconcurrentiteratekernel.cpp:(.text+0x3c): unde­fined ref­er­ence to ‘clock_gettime’collect2: ld returned 1 exit statusmake[1]: *** [../../lib/libQtCore.so.4.8.1] Error 1make[1]: Leav­ing direc­tory ‘/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?

    • http://sergioprado.org/ Ser­gio Prado

      Olá Renne,

      Me parece um prob­lema com o tool­chain. Qual toochain esta usando?

      • Renne

        Olá Ser­gio, eu ver­i­fiquei aqui e era uma con­fig­u­ração no g++.conf, eu arrumei e ficou desse jeito:

        # mod­i­fi­ca­tions 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++# mod­i­fi­ca­tions 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 con­fig­ure ; make ; make install,
        deu cert­inho.
        Obri­gado pela atenção.
        Renne Takao

  • http://www.facebook.com/roberto.araujo.1253234 Roberto Araujo

    boa Tarde Ser­gio, Veja se pode me dar uma ori­en­taçao, uti­lizo um equipa­mento de video, DVR, o sis­tema dele é linux gravado em uma eprom , pre­ciso edi­tar esse sis­tema já exis­tente para adi­cionar alguns recur­sos, você tem con­hec­i­mento disso pelo menos para me dar uma luz por onde eu devo seguir para con­seguir isto?
    Grato

    • http://cleitonbueno.wordpress.com/ Cleiton Bueno

      Eu pas­sei por algo semel­hante.
      No caso eu pre­cisava desco­brir a senha do root e não quebrá-la e alterar um arquivo .conf porem quando desli­gasse que­ria que voltasse alter­ado e não original.

      Bom depois de várias pesquisar minha solução foi ter em mãos o firmware do dis­pos­i­tivo ae usando bin­walk e con­hec­i­men­tos em linux (dd, mount, ldd, chroot, John The Rip­per e out­ras fer­ra­men­tas) foi pos­sível a descoberta e alter­ação da imagem e em seguida a imagem alter­ada foi regravada no dispositivo.

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

    • http://sergioprado.org/ Ser­gio Prado

      Olá Roberto,

      A idéia do Cleiton é boa. O primeiro passo é extrair o firmware da memória flash do equipa­mento. Depois você pode pas­sar nele o bin­walk para ten­tar extrair o rootfs.

      Um abraço.

    • http://www.facebook.com/roberto.araujo.1253234 Roberto Araujo

      Valeu pes­soal.

  • Paulo

    Viva Sér­gio. Parabéns pelo tra­balho! Segui os seus pas­sos com umas aju­das extra e já con­sigo uti­lizar o qt cre­ator para desen­volver apli­caçoes e cor­rer no meu friendl­yarm tiny6410. Acon­tece que tenho um prob­lema: no meu host faço uma janela toda “bonit­inha” mas quando corro no tar­get o tipo da letra altera-se com­ple­ta­mente ficando mto pequeno. Saberá qual pode ser o prob­lema? Outra coisa: vejo videos de mini/tiny com bons grá­fi­cos e o meu está longe de obter grá­fi­cos tãp bons. Alguma sugestão??

    Obri­gado

    • http://sergioprado.org/ Ser­gio Prado

      Olá Paulo!

      As fontes do Qt estão insta­l­adas no tar­get? Com relação aos grá­fi­cos, pode ser a qual­i­dade do dis­play que esta usando.

      Um abraço.

  • André Bisinoto Matias

    Olá, Sér­gio

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

    Estou enfrentando a seguinte situação:

    se eu cross­com­pilo o Qt para a Bea­gle­bone usando o parâmetro ‘-sta­tic’ no con­fig­ure, a apli­cação que estou deen­vol­vendo roda normalmente.

    Se, ao con­trário, uso o parâmetro ‘-shared’, a apli­cação não encon­tra as libs do Qt (ape­sar de cor­re­ta­mente alo­cadas e lis­tadas no LD_LIBRARY_PATH).

    Após muito pesquisar, acho que este prob­lema pode estar rela­cionado 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 mel­hor saída? Gerar o rootfs a par­tir do meu toolchain?

    Obri­gado!
    André

    • http://sergioprado.org/ Ser­gio Prado

      Olá André,

      Sim, neste caso você pre­cis­aria usar um rootfs ger­ado pelo seu toolchain.

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