2012-04-03 17 views
7

Mi pregunta es engañosamente simple, pero he perdido varias horas de estudio tratando de obtener la solución. Intento crear un Makefile que construya un ejecutable para cada archivo .c en un directorio.Makefile: crea un ejecutable para cada .c en la carpeta

he intentado lo siguiente:

CC = gcc 
SRCS = $(wildcard *.c) 
OBJS = $(patsubst %.c,%.o,$(SRCS)) 

all: $(OBJS) 
$(CC) $< -o [email protected] 

%.o: %.c 
    $(CC) $(CPFLAGS) -c $< 

pero de esta manera se está creando sólo .o archivos, y no cualquier ejecutable. Necesito una regla que haga un ejecutable para cada uno de estos archivos .o. Algo así como lo siguiente:

gcc src.o -o src 
+0

Fwiw, HTH http://stackoverflow.com/questions/5950395/makefile-to-compile-multiple-c-programs/13696012#13696012 – Robert

Respuesta

1

Su all está diciendo que sólo la construcción de los ficheros objeto. Añadir algo como

EXEC = $ (patsubst% .c,%, $ (SRC))

todo: $ (EXEC)

5

rob's respuesta no parece funcionar en mi máquina. Tal vez, como el Makefile completo:

SRCS = $(wildcard *.c) 

all: $(SRCS:.c=) 

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

(Las dos últimas líneas, son en mi máquina, innecesaria, ya que las reglas predeterminadas son adecuadas.)

+1

Eso es exactamente lo que quería. Muy agradecido. no pudo usar correctamente ':.' – eduardomoroni

+0

@eduardomoroni: Debe tener en cuenta que el nombre de su macro 'CPFLAGS' no es estándar. Normalmente debería ser 'CFLAGS' o' CPPFLAGS' o ambos. Ver [CFLAGS vs CPPFLAGS] (// stackoverflow.com/q/2754966). –

+0

@eduardomoroni: Por cierto, si encontraste útil esta respuesta de hace seis años, ¿entonces quizás deberías 'aceptarla'? Gracias. –

0

Pruebe lo siguiente:

% : %.c 
    $(CC) $(CFLAGS) $(CPPFLAGS) -o [email protected] $< 
all: $(basename $(wildcard *.c)) 

y ni siquiera necesita las dos primeras líneas, ya que make sabe cómo compilar y vincular archivos .c en ejecutables. Aún así, a menudo es necesario cambiar las recetas integradas de make.

Cuestiones relacionadas