2010-04-18 12 views
12

Mi Makefile es:siempre hacen reconstruir

OBJS = b.o c.o a.o 
FLAGS = -Wall -Werror 
CC = gcc 

test: $(OBJS) 
    $(CC) $(FLAGS) $(OBJS) -o test 
b.o: b.c b.h 
    $(CC) $(FLAGS) -c b.c 
a.o: a.c b.h c.h 
    $(CC) $(FLAGS) -c a.c 
c.o: c.c c.h 
    $(CC) $(FLAGS) -c c.c 
clean: 
    rm a 
    rm *.o 
all: test 

Si hago makemake entonces otra vez, siempre reconstruye 'prueba'. ¿Por qué hace esto?

Incluso si lo hago: make a.o reconstruye ... Estoy en Linux si eso ayuda.

En windows si cambio 'test' por 'test.exe' y '-o test' por '-o test.exe', funciona bien. Así que supongo que por alguna razón 'make' en mi Linux no puedo verificar las fechas de mis archivos en el directorio.

I FIJO ¡! Los archivos .c se crearon en Windows. Abrí todos los .c y .h en vi, y sin hacer nada salvo los cambios, y todo funcionó. Creo que la cosa de la fecha se solucionó al hacer esto.

+0

¿Se puede resolver un caso de prueba más simple? (Por ejemplo, menos archivos, tal vez un programa tipo hello world, para que pueda incluir todo en la pregunta). Ha cambiado la forma en que funciona la regla * test * en una edición reciente, y sospecho que hay otras diferencias significativas con respecto a lo que ha sido publicado –

+0

Creo que el problema es Linux. Si en ese archivo MAKE cambio la 'prueba' por 'text.exe' y en su regla '-o text.exe', funciona bien. – fsdfa

+0

Solo como un lado, probablemente no deberías llamar a tu "prueba" ejecutable. La mayoría de los UNIX tienen un verdadero programa de "prueba". – paxdiablo

Respuesta

14

Su primera regla es:

test: $(OBJS) 

Eso significa que si un archivo llamado 'prueba' no existe, la regla debe correr y crearlo. Como 'prueba' nunca existe (esa regla en realidad no crea un archivo llamado 'prueba'), se ejecuta cada vez. Debe cambiar 'prueba' a 'a', la salida real de esa norma

Para referencia futura, si una norma no crea realmente la cosa en el lado izquierdo, debe marcarlo con:

.PHONY: test 
+0

Lo siento, fue mi error tipográfico ...es así en el Makefile – fsdfa

2

es necesario especificar que prueba es un phony target:

OBJS = b.o c.o a.o 
CFLAGS = -Wall -Werror 
CC = gcc 

.PHONY: all test clean 
# 'all' and 'clean' are also phony 

all: test 
test: a 

a: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o a 

b.o: b.c b.h 
a.o: a.c b.h c.h 
c.o: c.c c.h 

clean: 
    rm a 
    rm *.o 

he puesto todo primero por lo que es el destino predeterminado (que es común), eliminado los comandos para compilar (make ya tiene los incorporados), y FLAGS cambiado a CFLAGS (que es el nombre común para los indicadores del compilador C y utilizado por las reglas integradas de make).

+0

Continúa reconstruyendo todo. – fsdfa

2

Como último recurso puede ejecutar Make en modo de depuración (make -d) y peinar a través de la salida. Antes de intentar eso, le sugiero que agregue una línea a la regla de "prueba" para ver si hay algún requisito previo que haga que Think requiera la reconstrucción de la prueba (y use algunas variables automáticas en el comando de compilación, como una buena práctica).

test: $(OBJS) 
    @echo prereqs that are newer than test: $? 
    $(CC) $(FLAGS) $^ -o [email protected] 
Cuestiones relacionadas