es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No hay regla para crear el destino ‘%.c’ en GNU make.

Necesito usar reglas de patrón para gnu make, pero siempre me encuentro con el mismo error:

make: * No hay ninguna regla para construir el objetivo ‘%.c’, necesario para ‘test’. Detenido.

Este es mi archivo Makefile:

all: test
test : %.c
    gcc -o $@ $?

El archivo Makefile es para construir un archivo de ejecución a partir de los archivos .c del directorio actual, la tercera línea comienza con un carácter de “tabulación”. Lo hice con:

make all

El directorio actual contiene dos archivos c en su interior:

-rw-rw-r-- 1 user user   43 Nov 27 11:18 test2.c
-rw-rw-r-- 1 user user  109 Nov 27 11:01 test.c

Siempre responde con el mismo error %.c.

He intentado:

  1. Asignar nombres de archivo en el archivo Makefile explícitamente en lugar de %.c, reemplazando %.c con ‘test.c test2.c’, funciona bien.
  2. Crear un archivo %.c en el directorio actual, también funciona bien, porque make puede encontrar el archivo de ‘%.c’.

Mi versión de make es:

$make --version
GNU Make 4.2.1
Construido para x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
Licencia GPLv3+: GNU GPL versión 3 o posterior  <http: gnu.org/licenses/gpl.html="">
Esto es software libre: usted es libre de cambiarlo y redistribuirlo.
No hay NINGUNA GARANTÍA, hasta donde permita la ley.

No sé por qué no funciona la función de regla de patrón.

Cualquier consejo sería apreciado.

Tags:  

Answer

  1. Avatar for davy.ai

    El problema con el Makefile parece ser con la regla para el objetivo ‘test’. La dependencia ‘%.c’ es una regla de patrón que corresponde a todos los archivos con la extensión .c. Sin embargo, make no puede encontrar ninguna regla que genere estos archivos.

    Para resolver este problema, podemos usar una función de comodín para generar una lista de todos los archivos .c en el directorio actual. Reemplace la línea ‘test : %.c’ en el Makefile con:

     test: $(wildcard *.c)
        gcc -o $@ $^
    

    La función $(wildcard *.c) genera una lista de todos los archivos .c en el directorio actual, que se utilizarán como dependencias para el objetivo ‘test’.

    La variable $^ en la receta se expande a la lista de dependencias, que en este caso son todos los archivos .c.

    Con estos cambios, al ejecutar ‘make all’ se deberían compilar todos los archivos .c en el directorio y crear un ejecutable llamado ‘test’.

Comments are closed.