Commit 0f3f0cba authored by Jomaro Rodrigues's avatar Jomaro Rodrigues

Closes #14

parent 33675037
......@@ -67,7 +67,7 @@
\subfile{compilacao.tex}
%\subfile{modulos.tex}
\subfile{modulos.tex}
%\subfile{recursividade.tex}
......
/* modulo imp fat.c */
#include <stdio.h>
#include "fatorial.h"
int main(){
long int i, j;
printf("Digite o numero do qual voce deseja obter o fatorial:");
scanf("%ld", &i);
j = fatorial(i);
printf("O fatorial de %ld e %ld", i, j);
}
/* cabecalho fatorial.h */
long int fatorial(long int n);
/* modulo fatorial.c */
#include <fatorial.h>
long int fatorial(long int n){
if (n < 2) return 1;
return n*fatorial(n-1);
}
......@@ -2,128 +2,116 @@
\begin{document}
Módulos
\chapter{Módulos}
\section{Modulando programas em C}
D.1 Modulando programas em C
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:
ffl criar vários arquivos que vão possuir o código dos m'odulos;
ffl criar arquivos cabeçalhos (.h);
ffl gerar os arquivos objetos e linkar todos os programas juntos.
Nessa seção, vamos falar especificamente de compila,c~ao e modula,c~ao em Linux, mas os passos acima
\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
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.
/* modulo imp fat.c */
#include !stdio.h?
#include "fatorial.h"
int main()f
long int i, j;
printf("Digite o numero do qual voce deseja obter o fatorial:");
scanf("%ld", &i);
j = fatorial(i);
printf("O fatorial de %ld e %ld", i, j);
g
/* cabecalho fatorial.h */
long int fatorial(long int n);
/* modulo fatorial.c */
#include !fatorial.h?
long int fatorial(long int n)f
if (n!2) return 1;
return n*fatorial(n-1);
g
Um arquivo cabeçalho nada mais é do que um arquivo que possui todas as declara,cões de fun,c~oes,
variáveis globais e constantes de um módulo.
O arquivo fatorial.h é um arquivo cabeçalho que possui a declara,cão da fun,c~ao fatorial. Para um
compilador C, essa informação é suficiente para criar o arquivo objeto, mas n~ao para gerar o executável.
Para gerar um arquivo executável é necess'ario que exista acesso `a definição da fun,c~ao, que est'a no módulo
fatorial.c.
83
84 AP
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.
^
êNDICE D. M
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.
'
ODULOS
Usando o compilador gcc, para poder juntar os módulos acima e gerar um executável, basta digitar a
seguinte linha de comando:
gcc -o nome exec fatorial.c imp fat.c
O comando anterior vai gerar um arquivo executável chamado nome exec.
O método gen'erico para compilar vários módulos juntos 'e:
\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}
gcc -o nome exec arq1 arq2 arq3 .. arqn
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.
D.2 Make
O make é um utilitário de pr'e-processamento de arquivos, que permite realizar ações sobre determinados
arquivos condicionadas `a data de alteração de suas depend^encias.
\section{Make}
As depend^encias de um arquivo são outros arquivos do qual ele depende. Por exemplo, um programa
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
que tem função de manter um banco de dados atualizado a partir de um arquivo texto, tem este arquivo
texto como sua depend^encia.
texto como sua dependência.
No que se refere `a programação, o make pode ser utilizado para manter atualizado um programa que
t^em como depend^encia vários módulos.
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.
O make utiliza normalmente um arquivo chamado Makefile(ou makefile) que descreve quais são as
depend^encias de um programa e quais as ações que devem ser realizadas se alguma depend^encia estiver
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
desatualizada ou simplesmente não existir.
'
ê 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~ao existirem.
É 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.
êm um makefile, basicamente os seguintes elementos podem ser utilizados:
- depend^encias: é uma linha que atribui um rótulo para uma depend^encia, listando quais são os
arquivos que são depend^encias.
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.
Forma:
\begin{verbatim}
nome_depend: depend1 depend2 depend3
\end{verbatim}
nome depend: depend1 depend2 depend3
As depend^encias depend1...dependn devem ser arquivos. O nome depend pode ser o nome de um
As dependências depend1...dependn devem ser arquivos. O nome depend pode ser o nome de um
arquivo ou um rótulo.
Para cada depend^encia depend, pode ser descrito quais são as depend^encias de depend, caso exista
Para cada dependência depend, pode ser descrito quais são as dependências de depend, caso exista
alguma.
- ação: é uma linha que descreve que a,c~ao deve ser realizada se as depend^encias n~ao estiverem
- ação: é uma linha que descreve que ação deve ser realizada se as dependências não estiverem
atualizadas
Forma:
qualquer programa executável
êxemplo:
Exemplo:
Arquivo makefile:
nome exec: fatorial.o imp fat.o gcc -o nome exec fatorial.o imp fat.o
\begin{verbatim}
nome_exec: fatorial.o imp_fat.o
gcc -o nome_exec fatorial.o imp_fat.o
fatorial.o: fatorial.c fatorial.h
gcc -c fatorial.h
gcc -c fatorial.h
imp fat.o: imp fat.c fatorial.h
imp_fat.o: imp_fat.c fatorial.h
gcc -c imp_fat.c
\end{verbatim}
gcc -c imp fat.c
O makefile acima, foi criado para os módulos descritos nos exemplos da seção anterior.
Note que atualizar uma depend^encia, nesse caso, significa compilar os módulos necessários para gerar
Note que atualizar uma dependência, nesse caso, significa compilar os módulos necessários para gerar
o executável nome exec.
Para que as depend^encias sejam checadas e atualizadas, basta digitar make na linha de comando no
diretório em que se encontram os arquivos fontes e o makefile.
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.
\end{document}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment