Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Kefren en 22 Junio 2013, 19:45 pm



Título: Problema con makefile en C
Publicado por: Kefren en 22 Junio 2013, 19:45 pm
Hola a todos. Llevo ya bastante rato liado con un problema al que no encuentro solución, y no sé qué es lo que puede ocurrir. Estoy haciendo una práctica para la universidad, para la asignatura de Metodología de la Programación, donde damos C.

Pues bien, la práctica me la he inventado yo y combino elementos de todo lo que se ha visto a durante el cuatrimestre, con el fin de repasarlo todo. Tengo el siguiente makefile:

Código:
LIB_DIR = lib/
LIB = $(LIB_DIR)libProcesos.a
SRC_DIR = funcs/
INCLUDE_DIR = include/
BUILD_DIR = build/
BIN_DIR = bin/
OBJ = $(BUILD_DIR)existeFichero.o
FLAGS = -g -c

existeFichero.o:
gcc $(FLAGS) $(SRC_DIR)existeFichero.c
mv existeFichero.o $(BUILD_DIR)
libProcesos.a:
ar -r $(LIB) $(OBJ)
procesos.out:
gcc -o $(BIN_DIR)procesos.out main.c $(LIB)

A la hora de ejecutar make en la consola de Linux, SIEMPRE y digo SIEMPRE, me hace únicamente la compilación del primer archivo que haya. Es decir, sólo me creará existeFichero.o, mientras que libProcesos.a y procesos.out los ignora y ni si quiera entra en sus respectivas secciones.

He probado todo, cambiar el orden, etc. Y siempre me hace sólo el primero que haya. Si por ejemplo pongo el primero a procesos.out pues sólo me compilará ese.

¿Alguien sabe qué leches puede ocurrir? Agradecería un poco de ayuda.  :-(

SaluDOS


Título: Re: Problema con makefile en C
Publicado por: Khronos14 en 22 Junio 2013, 22:42 pm
Así no se hacen archivos de compilación Makefile, la gracia de estos archivos es hacerlos para que sólo te recompilen los módulos desactualizados. Te pongo un ejemplo:


Código:
CC=gcc

all: main.o prueba.o funcion.o
$(CC) main.o prueba.o funcion.o -o programa

main.o: main.c
$(CC) -c main.c

prueba.o: prueba.c prueba.h
$(CC) -c prueba.c

funcion.o: funcion.c funcion.h
$(CC) -c funcion.c

Escribiendo un simple make, comprueba si existen y si están actualizados (utiliza la fecha de modificación del fichero de código fuente y la del binario) todos los módulos: main.o, prueba.o y funcion.o. En caso de que no lo estén los compila y luego genera el archivo ejecutable final. El parámetro -c compila pero no linkea, es decir se generan archivos .o.

Los archivos Makefile también son muy útiles si le pones opciones como:

Código:
CC=gcc

all: main.o prueba.o funcion.o
$(CC) main.o prueba.o funcion.o -o programa

main.o: main.c
$(CC) -c main.c

prueba.o: prueba.c prueba.h
$(CC) -c prueba.c

funcion.o: funcion.c funcion.h
$(CC) -c funcion.c

clean:
rm -r -f *.o

Si ejecutas en la línea de comandos make clean, se borrarán todos los archivos *.o.

Existen macros para no tener que hacer esto archivo por archivo, buscando un poco en google lo encontrarás, pero para explicar es mejor este método.

Saludos.


Título: Re: Problema con makefile en C
Publicado por: Kefren en 23 Junio 2013, 17:35 pm
Gracias por la respuesta Khronos14, es cierto que tengo algunos fallos de concepto que estoy intentando corregir xD.

Buscaré información sobre los makefile. Aunque ya he conseguido que me compile todos los ficheros usando all.

SaluDOS