Mdulos e Compilao em Separado
Neste tpico abordaremos a possibilidade de uma aplicao ser composta por vrios
mdulos e como utilizar o utilitrio make para facilitar a compilao da aplicao
2Mdulos
Um programa em C pode ser divido em vrios arquivos-fontes
Em aplicaes grandes comum identificar funes afins e agrup-las por arquivos que chamamos de mdulos Assim, a implementao de um programa
pode ser composta por um ou mais mdulos Facilita a diviso de uma tarefa complexa
em tarefas menores (dividir para conquistar) Reaproveitamento de cdigo
3Compilao em separado
No caso de um programa com vrios mdulos, cada um deles deve ser compilado separadamente, gerando um arquivo objeto (extenso .o) para cada mdulo
Aps a compilao de todos os mdulos, uma outra ferramenta, denominada ligador ou linkeditor, usada para juntar todos os arquivos objetos em um nico executvel
4Mdulos e compilao em separado
Para ilustrar o uso de mdulos em C, vamos considerar a existncia de um arquivo my_io.c que contm a implementao das funes de entrada de dados read_line e read_int
5Programa my_io.c (1/2)#include#include#defineMAX_LENGTH120
voidread_line(charline[],intmax_length){inti=0;charch;
while((ch=getchar())!='\n'){if(i
6Programa my_io.c (2/2)
boolread_int(int*inteiro){intresult;
charline[MAX_LENGTH+1];read_line(line,MAX_LENGTH);result=sscanf(line,"%d",inteiro);return(result==1);}
8Mdulos e compilao em separado
A partir desses dois arquivos-fontes (my_io.c e prog1.c), podemos gerar um programa executvel compilando cada um separadamente e depois ligando-os em um nico arquivo executvel
Por exemplo: gcccmy_io.c gcccprog1.c gccoprog1prog1.omy_io.o
9Mdulos e compilao em separado
Para que outros programas utilizem o mdulo my_io.c, eles precisam conhecer os prottipos das funes oferecidas por my_io.c
No exemplo anterior isso foi resolvido por meio da repetio dos prottipos no incio do arquivo prog1.c
Isto invivel para mdulos com muitas funes ou se desejarmos usar funes de muitos mdulos
10
Mdulos e compilao em separado
Para contornar esse problema, todo mdulo de funes C costuma estar associado a um arquivo de cabealho (.h) que contm apenas os prottipos das funes oferecidas pelo mdulo e, s vezes, os tipos de dados exportados
Este arquivo caracteriza a interface do mdulo
Em geral possui o mesmo nome do mdulo s que com a extenso .h
11
my_io.h/*my_io.h*Funesoferecidaspelomdulomy_io.c*/#ifndef_MY_IO_H#define_MY_IO_H#defineMAX_LENGTH120//comprimentomximodaentrada#include
/*Funoread_line:lumalinhadotecladocujotamanhomximo*dadopelo2argumentoeaarmazenano1argumento*/voidread_line(char*,int);
/*Funoread_int:lumalinhadotecladoearmazenaemseu*parmetrosealinhacontiveruminteiroedevolveverdadeiro,*casocontrrio,devolvefalso*/boolread_int(int*);
#endif
Retire a definio desta constante do
my_io.c
12
Mdulos e compilao em separado
uma boa prtica comentar as funes oferecidas por um mdulo
Para evitar que o mesmo arquivo .h seja includo por mais de um mdulo de uma aplicao, costuma-se definir uma constante que identifica o mdulo e verificar se esta constante ainda no foi definida
Por conveno o nome da constante _NOMEDOMDULO_H
13
Mdulos e compilao em separado
Agora, em vez de repetir manualmente os prottipo das funes, basta apenas incluir o arquivo .h
Por exemplo:#include#include"my_io.h"intmain(){...}
Os arquivos de cabealho das funes da biblioteca padro de C so includos da forma #include
Os arquivos de cabealho de nossos mdulos so geralmente includos da forma #include"arquivo.h"
14
make make uma ferramenta que controla a
gerao de arquivos executveis e objetos a partir dos programas-fontes da aplicao
O make obtm as informaes de como construir a aplicao a partir de um arquivo chamado makefile, que lista cada arquivo objeto ou executvel e como ger-lo a partir de outros arquivos
15
Dependncias O make cria o programa a partir de suas dependncias descritas no arquivo makefile
Por exemplo, para criar um arquivo objeto, programa.o, necessrio pelo menos o arquivo programa.c (pode haver outras dependncias, como arquivos de cabealho .h)
16
make Grafo de dependncias
17
make Grafo de dependncias
editado
18
makefile O arquivo makefile ou Makefile
determina o relacionamento entre arquivos-fontes, objetos e executvel
Uma dependncia no makefile definida da seguinte formatarget:dependncia1dependncia2...
comandoparagerartargettabulao
19
makefile Exemplo de um
makefileproject1:main.odata.oio.o
gccoproject1main.odata.oio.o
main.o:main.cdata.hio.h
gcccmain.c
data.o:data.cdata.h
gcccdata.c
io.o:io.cio.h
gcccio.c
20
makefile Aps criar seu makefile e os
arquivos-fontes de sua aplicao, basta digitar make no terminal
Se voc no quiser chamar seu arquivo de dependncias de makefile ou Makefile, voc pode digitar makefmymakefile
A ordem das dependncias importante, pois o make tentar criar ou atualizar a primeira dependncia listada
21
Exerccios
1)Crie um arquivo makefile para a aplicao mostrada como exemplo nesta aula.
2)Acrescente ao mdulo my_io as funes read_float, read_double e read_char.
3)Crie um mdulo my_math com as funes fatorial, arredondarParaInt e arredondar.
4)Implemente uma aplicao que use o mdulo my_math. Crie um makefile para esta aplicao.
22
Referncias
CELES, W.; CERQUEIRA, R.; RANGEL, J.L.. Introduo a Estruturas de Dados. Elsevier, 2004.
PRATA. Stephen. C Primer Plus. 5. ed., Sams, 2005.
GNU Project. GNU Make. Disponvel em http://www.gnu.org/software/make.
Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22