sábado, 30 de julho de 2011

Compilando arquivos com a ajuda do Makefile

Olá pessoal, hoje trataremos do utilitário Makefile. Ele nos ajudará a compilar nosso programa de hoje. Nosso programa é bem simples, na verdade o objetivo principal é a utilização do Makefile quando precisamos compilar projetos com mais de um arquivo.

Os softwares que utilizamos nesse artigo:

gcc – nosso compilador, versão 4.4.5
emacs – nosso editor, você pode utilizar qualquer editor para criar seus arquivos de código.
Sistema Operacional – Debian

Nosso pequeno projeto consistirá de três arquivos:

main.c – conterá nossa aplicação principal
matematica.c – esse conterá funções matemáticas, um exemplo didático
matematica.h – nosso arquivo cabeçário

Vamos começar pelo arquivo “matemática.c”

#include "matematica.h"
//calcula fatorial de um numero
int fatorial (int n)
{
if(n==1)
return n;
else
return n * fatorial(n-1);
}
//retorna o modulo de um inteiro
int modulo(int n)
{
if(n<0)
return n * (-1);
else
return n;
}
//verifica se um número é par
//se a funcao retornar 1 - é par, 0 - é ímpar
int e_par(int n)
{
int resto;
resto = n % 2;
if (!resto)
return 1; // é par
else
return 0; //não é par
}

Agora, nós vamos criar um arquivo com a extensão .h, “matematica.h” para apenas conter as chamadas das funções.
Veja:
extern int fatorial (int n);
extern int modulo (int n);
extern int e_par (int n);

Bem simples, não concorda?

Agora vamos ao nosso programa “main.c”

#include <stdio.h>
#include "matematica.h"

int menu()
{
int op;
printf("\n\t1 - Fatorial:");
printf("\n\t2 - Modulo:");
printf("\n\t3 - Verifica se e par:");
printf("\n\tOpcao:\t");
scanf("%d",&op);
return op;
}
int main ()
{
int op,num;
do
{
op = menu();
switch(op)
{
case 1:printf("\n\tInforme um numero: ");
scanf("%d",&num);
printf("\n\tFatorial do numero: %d\n",fatorial(num));
break;
case 2:printf("\n\tInforme um numero: ");
scanf("%d",&num);
printf("\n\tO modulo do numero e: %d\n",modulo(num));
break;
case 3:printf("\n\tInforme um numero: ");
scanf("%d",&num);
num = e_par(num);
if(num)
printf("\n\tE PAR!\n");
else
printf("\n\tE IMPAR!\n");
break;
}

}while(op<4);

}

Finalizamos nossa codificação. Agora, vamos ao nosso Makefile.

programa_final: main.o matematica.o
     gcc -o programa_final main.o matematica.o
main.o: main.c matematica.h
     gcc -c main.c
matematica.o: matematica.c matematica.h
     gcc -c matematica.c
Veja que, programa_final, é o arquivo final, ou seja, aquele que vamos executar com o comando: ./programa_final. A estrutura do arquivo é bem simples. A esquerda temos o arquivo que será gerado, chamado de “target”, e a direita temos suas dependências. Abaixo vem o comando para sua compilação. Para os outros aquivos a regra é a mesma.

Assim crie um arquivo chamado Makefile, e coloque esse código em seu interior. Após isso apenas digite em sua linha de comando: “make”

Os arquivos serão compilados e você terá a seguinte saída:

gcc -c main.c
gcc -c matematica.c
gcc -o programa_final main.o matematica.o

Assim será gerado o arquivo “programa_final”. Agora o execute com o comando: ./programa_final

Outro ponto que merece atenção é que só os arquivos que foram alterados serão recompilados. Imagine que você está trabalhando com um grande número de arquivos, se você alterar apenas 1 arquivo não terá porque recompilar todos. Vamos fazer um teste, vamos alterar o arquivo main, e vamos rodar o make novamente.

A saída do comando make deveria ter sido:
gcc -c main.c
gcc -o programa_final main.o matematica.o

Sem a compilação do arquivo matematica.c, pois o mesmo não foi alterado.

Espero ter ajudado com essa pequena introdução sobre o Makefile.





Nenhum comentário:

Postar um comentário