modulos.tex 4.1 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 15 16 17 18 19 20
\begin{itemize}
	\item criar vários arquivos que vão possuir o código dos módulos;
	\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 26 27
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.



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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
31 32 33 34
O arquivo fatorial.h é um arquivo cabeçalho que possui a declaração da função fatorial. Para um
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.
35 36 37 38 39


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
40 41 42 43 44 45 46 47 48 49
\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}
50 51 52 53

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
54
\section{Make}
55

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
56 57 58 59
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
60
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
61
texto como sua dependência.
62

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
66 67
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
68 69
desatualizada ou simplesmente não existir.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
70 71
É 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.
72

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
73 74 75
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.
76 77

Forma:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
78 79 80
\begin{verbatim}
nome_depend: depend1 depend2 depend3
\end{verbatim}
81

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

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

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

Forma:

qualquer programa executável
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
94 95

Exemplo:
96 97

Arquivo makefile:
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
98 99 100 101 102

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

103
fatorial.o: fatorial.c fatorial.h
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
104
	gcc -c fatorial.h
105

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
106 107 108
imp_fat.o: imp_fat.c fatorial.h
	gcc -c imp_fat.c
\end{verbatim}
109 110

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

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
114 115
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.
116 117

\end{document}