# 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:

- kscribble.h : contém a declaração de classe para a classe KScribbleApp.

- kscribbledoc.h : contém a declaração de classe para a classe KScribbleDoc.

- kscribbleview.h : contém a declaração de classe para a classe KScribbleView.

- resource.h : contém uma colecção de macro para os menu-ID's

Código:

- kscribble.cpp : contém a implementação da classe KScribbleApp.

- kscribbledoc.cpp : contém a implementação da classe KScribbleDoc.

- kscribbleview.cpp : contém a implementação da classe KScribbleView.

- main.cpp : contém a implementação da função main().

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.