2009-09-27 7 views

Respuesta

145

Interesante, no sabía que la opción predefinida para usar el compilador de C daba reglas con respecto a los archivos fuente.

De todos modos, una solución simple que demuestra conceptos Makefile simples serían:

HEADERS = program.h headers.h 

default: program 

program.o: program.c $(HEADERS) 
    gcc -c program.c -o program.o 

program: program.o 
    gcc program.o -o program 

clean: 
    -rm -f program.o 
    -rm -f program 

(tener en cuenta que hacer requiere pestaña en lugar de la hendidura del espacio, así que asegúrese de fijar que cuando se copia)

Sin embargo, para admitir más archivos C, tendría que crear nuevas reglas para cada uno de ellos. Por lo tanto, para mejorar:

HEADERS = program.h headers.h 
OBJECTS = program.o 

default: program 

%.o: %.c $(HEADERS) 
    gcc -c $< -o [email protected] 

program: $(OBJECTS) 
    gcc $(OBJECTS) -o [email protected] 

clean: 
    -rm -f $(OBJECTS) 
    -rm -f program 

Traté de hacer esto tan simple como sea posible, omitiendo variables como $ (CC) y $ (CFLAGS) que generalmente se observan en los archivos make. Si estás interesado en averiguarlo, espero haberte dado un buen comienzo en eso.

Aquí está el Makefile que me gusta usar para la fuente C. Siéntase libre de usarlo:

TARGET = prog 
LIBS = -lm 
CC = gcc 
CFLAGS = -g -Wall 

.PHONY: default all clean 

default: $(TARGET) 
all: default 

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c)) 
HEADERS = $(wildcard *.h) 

%.o: %.c $(HEADERS) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

.PRECIOUS: $(TARGET) $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected] 

clean: 
    -rm -f *.o 
    -rm -f $(TARGET) 

Utiliza las características comodín y patsubst de la utilidad make para incluir automáticamente .c y .h en el directorio actual, es decir, al agregar nuevos archivos de código a su directorio, no tendrá que actualizar el Makefile. Sin embargo, si desea cambiar el nombre del ejecutable generado, las bibliotecas o los indicadores del compilador, puede modificar las variables.

En cualquier caso, no use autoconf, por favor. ¡Te lo ruego! :)

+6

Para ser técnicamente correcto, creo que deberías usar '.PHONY: limpiar todos los valores por defecto' para aquellos objetivos que están destinados a ser utilizados desde la línea de comando. Además, Autoconf/Automake no son tan malos. Claro, se sienten mal, y acostumbrarse a ellos es tan divertido como forzar su cabeza a través de una pared de ladrillos, pero funcionan, y están bien desarrollados, y cubrirán la mayoría de sus bases en cuanto a portabilidad, y hará que tu vida sea mucho más fácil al final una vez que te acostumbres a su horrible diseño. –

+0

Supongo que esto funciona, pero pensé que si escribía "make" en la terminal el programa debería ejecutarse. Esto es lo que obtengo: gcc statsh.o -Wall -lm -o prog ¿Es posible simplemente escribir make y ejecutar el programa? – user69514

+0

donde agregaría la marca openmp -fopenmp – MySchizoBuddy

22

Por ejemplo este sencillo Makefile debería ser suficiente:

 
CC=gcc 
CFLAGS=-Wall 

all: program 
program: program.o 
program.o: program.c program.h headers.h 

clean: 
    rm -f program program.o 
run: program 
    ./program 

Nota no debe ser <tab> en la siguiente línea después de la limpieza y correr, no espacios.

ACTUALIZACIÓN comentarios a continuación aplican

+0

@ user69514: 'make' sin argumentos por lo general sólo la acumulación * * su software. Para ejecutarlo, use 'make run' (disponible en esta respuesta, pero no necesariamente en todos los' Makefile's), o ejecútelo directamente: './Program' – MestreLion

-9
gcc program.c -o program 

ningún makefile necesario.

+25

Bastante inmanejable si su programa aumenta, no lo haga ¿Crees? –

10
all: program 
program.o: program.h headers.h 

es suficiente. el resto es implícito

+0

Y si todo su programa es un solo archivo '.c', solo' program: 'es necesario. Sweet :) – MestreLion

0

Dependiendo del número de encabezados y sus hábitos de desarrollo, es posible que desee investigar gccmakedep. Este programa examina su directorio actual y agrega al final del makefile las dependencias de encabezado para cada archivo .c/cpp. Esto es excesivo cuando tienes 2 encabezados y un archivo de programa. Sin embargo, si tiene más de 5 pequeños programas de prueba y está editando uno de los 10 encabezados, puede confiar en make para reconstruir exactamente esos programas que fueron modificados por sus modificaciones.

7

El más sencillo hacer archivo puede ser

all : test 

test : test.o 
     gcc -o test test.o 

test.o : test.c 
     gcc -c test.c 

clean : 
     rm test *.o 
+0

puede agregar más detalles para explicar lo que hace su Makefile – Federico

+1

en realidad puede ir mucho más simple. ver @anonymous 1 liner –

Cuestiones relacionadas