O ambiente de trabalho K

3.2. A Primeira Construção

Após o seu projecto ser gerado, iremos primeiro fazer uma viagem através do código fonte para obter um entendimento geral de como funciona o esqueleto da aplicação. Isto não só ajudará a começar como também saberemos onde mudar o quê em passos futuros.

Quando abrimos a página do VLF (Visualizador Lógico de Ficheiros) na vista de árvore, você vê algumas pastas que já ordenam os ficheiros do projecto relevantes para o programador. As duas primeiras pastas são "Header" e "Código". A pasta-Header assim sendo contém logicamente todos os ficheiros header do projecto, a pasta-Código todo o código fonte. Todas as outras pastas não são de interesse por agora, pelo que voltaremos aqui mais tarde para ver o que contêm.

Essas duas pastas contêm então os seguintes ficheiros:

Headers:

Código:

Mas antes de mergulharmos no código, vamos deixar o KDevelop construir e correr a nossa nova aplicação. Para fazer isto, seleccione "Make" a partir do menu "Construir" ou prima o botão correspondente na barra de ferramentas . A janela de output abre na base do KDevelop e deixa-o ver o que o make está a fazer através das mensagens que nos dá:

 1   Making all in docs
 2   make[1]: Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
 3   Making all in en
 4   make[2]: Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs/en'
 5   make[2]: Nothing to be done for `all'.
 6   make[2]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs/en'
 7   make[2]: Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
 8   make[2]: Nothing to be done for `all-am'.
 9   make[2]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
 10  make[1]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
 11  make[1]: Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble'
 12  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribbleview.cpp
 13  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribbledoc.cpp
 14  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c 		
     kscribble.cpp
 15  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     main.cpp
 16  /usr/bin/moc ./kscribble.h -o kscribble.moc.cpp
 17  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribble.moc.cpp 		
 18  /usr/bin/moc ./kscribbledoc.h -o kscribbledoc.moc.cpp
 19  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribbledoc.moc.cpp
 20  /usr/bin/moc ./kscribbleview.h -o kscribbleview.moc.cpp
 21  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribbleview.moc.cpp
 
 22  /bin/sh ../libtool --silent --mode=link g++  -O0 -g -Wall   -o kscribble -L/opt/kde/lib  -L/usr/X11R6/lib -rpath /opt/kde/lib
     -rpath /usr/X11R6/lib kscribbleview.o kscribbledoc.o kscribble.o main.o kscribble.moc.o kscribbledoc.moc.o kscribbleview.moc.o
     -lkfile -lkfm -lkdeui -lkdecore -lqt -lXext -lX11
 
 23  make[1]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble'

Como pode ver, numeramos todas as linhas, o que não irá surgir no seu output; apenas torna mais fácil descrever agora o que aconteceu durante a construção. Primeiro que tudo, o make trabalha recursivamente. Isto é, comça no directório em que foi invocado e então vai para os subdirectórios primeiro, regressa e processa o subdirectório seguinte. Finalmente, o directório em que foi iniciado é processado e o make termina. Assim, o make começou primeiro no directório principal do projecto contendo o código. Nas linhas 1 e 2, você vê como o processo make entra no directório docs, depois no subdirectório en. Como não existe nada para fazer, ele deixa estes directórios até regressar ao directório fonte kscribble na linha 11. Depois, o verdadeiro trabalho começa: o make invoca o compilador, aqui o g++ para compilar o ficheiro de código kscribbleview.cpp. A macro -DHAVE&_;CONFIG&_;H diz que o ficheiro config.h deverá ser utilizado. Este é um ficheiro que contém macros para a plataforma e aplicação específicas e está localizado no directório principal do projecto. Os comandos -I seguintes adicionam o caminho include onde o g++ pode encontrar os includes de que necessita. O caminho é o directório corrente, o directório principal do projecto (através de -I..) e o caminho include para o KDE, Qt e ficheiros header da biblioteca X11. Os directórios para estes ficheiros include foram determinados pelo script configure e definidos nos Makefiles, pelo que, o compilador sabe onde estes se encontram. Finalmente, -O0 define a optimização para zero (sem optimização), -g permite a depuração, -Wall define os avisos do compilador para todos e -c diz ao compilador para produzir um ficheiro de objecto, ou seja apenas compilar o ficheiro.

Isto é feito também para os outros ficheiros de código do nosso projecto nas linhas 13-15. Obviamente, o nosso código é compilado, mas em vez de ligar os ficheiros objecto do código ao binário final, nós vemos alguns outros comandos. Na linha 16, você vê que o programa "moc" é chamado para processar o ficheiro header kscribble.h, com o seu resultado em kscribble.moc.cpp. Depois, na linha 17, este ficheiro de código é também compilado. O mesmo acontece com os outros ficheiros header do projecto até à linha 21. Agora, como o conjunto de ferramentas Qt contém o mecanismo sinal/espaço, mas continua a ser uma implementação C++, você está a utilizar algumas palavras-chave que não são originalmente linguagem C++, tais como as declarações signals: e slots: nas suas classes. Isto dá-lhe a possibilidade de permitir facilmente comunicação entre objectos para todas as classes de objectos que herdem a classe QObject, pelo que pode evitar os normais ponteiros para funções de chamada (callback). Assim, a aplicação necessita do código que implementa esta funcionalidade, e é por isto que o moc é chamado. Moc é o Compilador de Objectos Meta (Meta Object Compiler) do conjunto de ferramentas Qt e constroi a implementação para mecanismos de sinais e espaços percorrendo os ficheiros header e produzindo um código de resultado que tem de ser compilado no binário. Como os projectos do KDevelop utilizam o automoc para determinar, que ficheiro header necessita de ser processado, você não tem de se preocupar com nenhuma chamada ao moc nem com o compilador C++ no ficheiro moc de resultado. Lembre-se apenas da regra que faz uma classe utilizar os sinais e espaços- hereditariedade da QObject ou qualquer classe que herde em si a QObject, inclusão da macro Q&_;OBJECT (sem ponto e vírgula !) no início da declaração de classe e a declaração para os sinais e espaços.

Finalmente, o seu binário é construido pelo compilador. O binário de resultado é chamado kscribble, o linkador inclui o caminho para as bibliotecas KDE e X11 e liga o código contra as bibliotecas kfile, kfm, kdeui, kdecore, qt, Xext e X11. Depois tudo está feito e o make termina.