modulos.tex 4.09 KB
Newer Older
1 2 3 4
\documentclass[apostila.tex]{subfiles}


\begin{document}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
5 6 7
\chapter{Módulos}

\section{Modulando programas em C}
8 9 10 11 12 13

Uma das características mais interessantes da linguagem C é a possibilidade de dividir um programa em
vários arquivos diferentes (módulos).

Modular um programa em C é relativamente simples. Os passos necessários são:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
14
\begin{itemize}
15
	\item criar vários arquivos que conterão o código dos módulos;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
16 17 18 19 20
	\item criar arquivos cabeçalhos (.h);
	\item gerar os arquivos objetos e linkar todos os programas juntos.
\end{itemize}

Nessa seção, vamos falar especificamente de compilação e modulação em Linux, mas os passos acima
21 22 23 24 25
são válidos em qualquer sistema operacional, embora sejam realizados de maneira diferente.

Para ilustrar o processo, vamos desenvolver um programa e um módulo que será utilizado por este
programa.

26
Um arquivo cabeçalho nada mais é do que um arquivo que contém todas as declarações de funções,
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
27
variáveis globais e constantes de um módulo.
28

29
O arquivo fatorial.h é um arquivo cabeçalho que contém a declaração da função fatorial. Para um
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
30 31 32
compilador C, essa informação é suficiente para criar o arquivo objeto, mas não para gerar o executável.
Para gerar um arquivo executável é necessário que exista acesso à definição da função, que está no módulo
fatorial.c.
33 34 35 36

Usando o compilador gcc, para poder juntar os módulos acima e gerar um executável, basta digitar a
seguinte linha de comando:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
37 38 39 40 41 42 43 44 45 46
\begin{verbatim}
gcc -o fatorial fatorial.c imp fat.c
\end{verbatim}

O comando anterior vai gerar um arquivo executável chamado fatorial.
O método genérico para compilar vários módulos juntos é:

\begin{verbatim}
gcc -o nome_exec arq1 arq2 arq3 .. arqn
\end{verbatim}
47 48 49 50

Onde arq1...arqn podem ser tanto arquivos fontes (arquivo texto com código C) como arquivos objetos,
gerados previamente pelo compilador gcc com a opção -c.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
51
\section{Make}
52

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
53 54 55 56
O make é um utilitário de pré-processamento de arquivos, que permite realizar ações sobre determinados
arquivos condicionadas à data de alteração de suas dependências.

As dependências de um arquivo são outros arquivos do qual ele depende. Por exemplo, um programa
57
que tem função de manter um banco de dados atualizado a partir de um arquivo texto, tem este arquivo
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
58
texto como sua dependência.
59

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
60
No que se refere à programação, o make pode ser utilizado para manter atualizado um programa que
61
tem como dependência vários módulos.
62

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
63 64
O make utiliza normalmente um arquivo chamado Makefile (ou makefile) que descreve quais são as
dependências de um programa e quais as ações que devem ser realizadas se alguma dependência estiver
65 66
desatualizada ou simplesmente não existir.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
67 68
É possível criar makefile's que compilam um determinado programa se os arquivos fontes e/ou objetos
do qual ele depende não estiverem atualizados ou não existirem.
69

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
70 71 72
Em um makefile, basicamente os seguintes elementos podem ser utilizados:
- dependências: é uma linha que atribui um rótulo para uma dependência, listando quais são os
arquivos que são dependências.
73 74

Forma:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
75 76 77
\begin{verbatim}
nome_depend: depend1 depend2 depend3
\end{verbatim}
78

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
79
As dependências depend1...dependn devem ser arquivos. O nome depend pode ser o nome de um
80 81
arquivo ou um rótulo.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
82
Para cada dependência depend, pode ser descrito quais são as dependências de depend, caso exista
83 84
alguma.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
85
- ação: é uma linha que descreve que ação deve ser realizada se as dependências não estiverem
86 87 88 89 90
atualizadas

Forma:

qualquer programa executável
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
91 92

Exemplo:
93 94

Arquivo makefile:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
95 96 97 98 99

\begin{verbatim}
nome_exec: fatorial.o imp_fat.o 
	gcc -o nome_exec fatorial.o imp_fat.o

100
fatorial.o: fatorial.c fatorial.h
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
101
	gcc -c fatorial.h
102

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
103 104 105
imp_fat.o: imp_fat.c fatorial.h
	gcc -c imp_fat.c
\end{verbatim}
106 107

O makefile acima, foi criado para os módulos descritos nos exemplos da seção anterior.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
108
Note que atualizar uma dependência, nesse caso, significa compilar os módulos necessários para gerar
109 110
o executável nome exec.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
111 112
Para que as dependências sejam checadas e atualizadas, basta digitar make na linha de comando no
diretório em que se encontram os arquivos fontes e o makefile.
113

114
\end{document}