O Manual de Programação do KDevelop: O Guia do Utilizador para Desenvolvimento de Aplicações C++ para o Ambiente de Trabalho K (KDE) com o ambiente de trabalho KDevelop, Versão 2.1 | ||
---|---|---|
Prev | Capítulo 3. Criar Novas Aplicações | Next |
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.