2011-03-01 8 views
8

Durante el uso de GNU-haga, mi Makefile tiene alguna regla patrón que:¿La regla del patrón Makefile falla?

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

Se añade esta regla por mí.

Pero cuando lo haga que sea da un error que dice No hay ninguna regla para hacer diana% .oy no construye los objetivos.

A veces, también existe este otro comportamiento. No construye el objetivo cuando digo make first time (Da error al decir No hay regla para hacer target), pero cuando digo make nuevamente inmediatamente, se construye correctamente.

Así que cuando especifico explícitamente cada archivo fuente por separado, crea los objetivos bien por primera vez.

EDIT: Estoy usando GNU-make en un Centos (v6.3 supongo, no estoy seguro). ¿Podría ser esto un problema de permiso/identificación de usuario/identificación de grupo?

Cualquier punteros para entender lo que podría estar sucediendo y solución para esto?

gracias, -AD.

+0

Teniendo exactamente el mismo problema aquí. Dios, yo __hate__ makefiles y su estúpida sintaxis y limitaciones arbitrarias. – antred

Respuesta

2

Es posible que tenga espacios alrededor del : en la primera línea de la regla. Además, gcc no toma dos puntos antes del nombre del archivo de salida; solo use -o [email protected].

+0

@Ok esos son mis errores tipográficos. Makefile no tiene ningún error. Todavía el problema persiste ... – goldenmean

+0

¿Puedes intentar 'hacer -d' en tu objetivo? Extrae una gran cantidad de resultados, pero puedes ver qué reglas está intentando y quizás ver qué está fallando. También puede publicar el resultado si cree que ayudaría a diagnosticar el problema. –

12

Hacer solo usa una regla de patrón como una especie de respaldo. Por ejemplo:

$ ls 
Makefile 
$ cat Makefile 
%.o: %.c 
    gcc $< -o [email protected] 
$ make 
make: *** No targets. Stop. 

Esto está bien. Make no tiene en cuenta la regla de patrón ya que no le ha pedido que haga nada, y no hay un objetivo predeterminado en el archivo MAKE. Vamos a pedirle que haga algo que pueda usar la regla de patrón.

$ make 1.o 
make: *** No rule to make target `1.o'. Stop. 

esperado. 1.c no existe, por lo que no se considera la regla de patrón. Intentemoslo de nuevo.

$ touch 1.c 
$ make 1.o 
gcc 1.c -o 1.o 

(y, a continuación, falta un error sobre main).

Personalmente, me desagradan estas reglas de respaldo intensamente. Prefiero incluir los objetivos explícitamente. Algo así como

file.o file2.o f.o: %.o: %.c 
    ... 

le ofrece una Regla de patrón específico de destino. Estos son bastante diferentes (ver el manual). [Ah, y el patrón no le da ninguna ventaja en este ejemplo Noddy.]

0

acaba de ejecutar a través de este problema.

Si esta es su regla:

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

Asegúrese de que tiene una pestaña y no espacios en la segunda línea antes del gcc. Me tomó un par de horas averiguarlo. También no ':' después de la bandera -o, como alguien más señaló.

0

¿Estás seguro de que existe el archivo .c? Creo que usar -d como se sugirió anteriormente debería ayudar a depurar esto.

Cuestiones relacionadas