Desafio C
Módulo matemático com Makefile
Enunciado
Crie um módulo matematica com as funções soma, subtrai e multiplica. Cada função deve ser definida em matematica.c e declarada em matematica.h. O main lê dois inteiros, chama as três funções e imprime os resultados no formato soma: X, subtracao: Y, multiplicacao: Z. Escreva um Makefile que compile e ligue tudo.
Requisitos
matematica.hcontém os protótipos das três funções.matematica.cdefine as três funções.main.clê dois inteiros e imprime os resultados no formato especificado.- O Makefile compila
matematica.cemain.cseparadamente e gera o executávelprograma.
Código inicial
// matematica.h
#ifndef MATEMATICA_H
#define MATEMATICA_H
// prototipos
#endif
// matematica.c
#include "matematica.h"
// definicoes
// main.c
#include <stdio.h>
#include "matematica.h"
int main(void) {
int a, b;
scanf("%d %d", &a, &b);
// chame as funcoes e imprima
return 0;
}
# Makefile
# regras
Saída esperada
soma: 13
subtracao: 7
multiplicacao: 30
Ver dica
No Makefile, use variáveis para o compilador e flags. Crie regras para cada .o e para o executável final.
Mostrar solução
// matematica.h
#ifndef MATEMATICA_H
#define MATEMATICA_H
int soma(int a, int b);
int subtrai(int a, int b);
int multiplica(int a, int b);
#endif
// matematica.c
#include "matematica.h"
int soma(int a, int b) {
return a + b;
}
int subtrai(int a, int b) {
return a - b;
}
int multiplica(int a, int b) {
return a * b;
}
// main.c
#include <stdio.h>
#include "matematica.h"
int main(void) {
int a, b;
scanf("%d %d", &a, &b);
printf("soma: %d\n", soma(a, b));
printf("subtracao: %d\n", subtrai(a, b));
printf("multiplicacao: %d\n", multiplica(a, b));
return 0;
}
# Makefile
CC = gcc
CFLAGS = -Wall -Wextra -std=c11
OBJ = matematica.o main.o
programa: $(OBJ)
$(CC) $(CFLAGS) -o programa $(OBJ)
matematica.o: matematica.c matematica.h
$(CC) $(CFLAGS) -c matematica.c
main.o: main.c matematica.h
$(CC) $(CFLAGS) -c main.c
clean:
rm -f *.o programa
Passo a passo
matematica.hdeclara os protótipos das três funções para quemain.cpossa usá-las.matematica.cinclui o cabeçalho e define cada função com a operação correspondente.main.clê dois inteiros comscanf, chama as funções e imprime no formato pedido.- O Makefile define
CCeCFLAGSpara compilação consistente. - A regra
programadepende dos objetosmatematica.oemain.oe os liga. - As regras
matematica.oemain.ocompilam cada fonte separadamente, listando o.hcomo dependência. - A regra
cleanremove objetos e o executável. - Executamos
makee depois./programa.
Por que funciona
A compilação separada permite compilar apenas o que mudou. O Makefile verifica timestamps: se matematica.c ou matematica.h mudar, matematica.o é recompilado. O linker junta os objetos resolvendo os símbolos das funções.
Erros comuns
- Esquecer de listar
matematica.hcomo dependência no Makefile: alterações no cabeçalho não disparam recompilação. - Não usar
-cnas regras de.o: o compilador tentaria linkar e falharia. - Esquecer
#include "matematica.h"emmain.c: declarações implícitas e possível erro de linker. - Usar
scanfsem verificar retorno: não é erro fatal, mas boa prática verificar.
Outra forma de resolver
Poderia usar gcc -c *.c e depois gcc *.o -o programa, mas o Makefile é mais eficiente e organizado.
Saída esperada
soma: 13
subtracao: 7
multiplicacao: 30