"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Comprensión del Makefile (Ejemplo con lenguaje C).

Comprensión del Makefile (Ejemplo con lenguaje C).

Publicado el 2024-07-31
Navegar:390

Comprendre le Makefile (Exemple avec langage C).

Un Makefile es un archivo utilizado por la herramienta make para automatizar la compilación de programas. Estas son las reglas estándar y las mejores prácticas para escribir un Makefile eficaz:

Estructura básica de un Makefile

  1. Destino: Lo que desea crear (por ejemplo, un archivo ejecutable).
  2. Requisitos previos: Los archivos necesarios para construir el destino (por ejemplo, archivos fuente).
  3. Regla: El comando a ejecutar para crear el objetivo.

Ejemplo sencillo

target: prerequisites
    command

Reglas estándar

  1. Regla predeterminada: el primer objetivo en el Makefile es el que se creará de forma predeterminada.

  2. Compilando archivos fuente:

    • Usar variables para compiladores y opciones.
    • Ejemplo :
   CC = gcc
   CFLAGS = -Wall -g
   SOURCES = main.c utils.c
   OBJECTS = $(SOURCES:.c=.o)
   TARGET = mon_programme

   $(TARGET): $(OBJECTS)
       $(CC) -o $@ $^

   %.o: %.c
       $(CC) $(CFLAGS) -c $



  1. Phonies: utiliza .PHONY para objetivos que no son archivos.
   .PHONY: clean
   clean:
       rm -f $(OBJECTS) $(TARGET)
  1. Variables: Utiliza variables para simplificar la gestión de rutas y opciones.
   CC = gcc
   CFLAGS = -Wall
  1. Gestión de dependencias: utiliza reglas y patrones implícitos para reducir la repetición.

  2. Dependencias automáticas: Puedes generar dependencias automáticamente para archivos .o.

   -include $(OBJECTS:.o=.d)

Ejemplo completo

Aquí hay un ejemplo completo de Makefile:

# Variables
CC = gcc
CFLAGS = -Wall -g
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
TARGET = mon_programme

# Règle par défaut
all: $(TARGET)

# Lien de l'exécutable
# $@ -> $(TARGET)
# $^ -> $(OBJECTS)
$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^

# Compilation des fichiers .c en .o
# $ Premier element des pr
%.o: %.c
    $(CC) $(CFLAGS) -c $



Buenas prácticas

  1. Sangría con tabulaciones: los comandos en las reglas deben tener sangría con tabulaciones, no con espacios.

  2. Código de comentario: utiliza comentarios para explicar secciones del Makefile.

  3. Agrupar archivos: si su proyecto contiene varios archivos, organícelos en subdirectorios y use variables para administrar las rutas.

  4. Usa reglas implícitas: aprovecha las reglas integradas de make para evitar reescribir reglas comunes.

¿Por qué utilizar .PHONY?

  • Evitar conflictos: Si existe un archivo con el mismo nombre que el objetivo, make pensará que el objetivo está actualizado y no ejecutará los comandos asociados. .PHONY evita esto.

  • Mejoras de rendimiento: Los objetivos falsos siempre se consideran "por hacer", lo que puede mejorar la velocidad de ejecución de los comandos asociados.

¿Por qué utilizar %.o:%c para la compilación?

  • Eficiencia: usar %.o:%c te permite beneficiarte de la optimización para recompilar solo lo necesario.

  • Práctico: Para proyectos más grandes, %.o:%c es mucho más adecuado.

Conclusión

Un Makefile bien estructurado facilita la gestión de proyectos y evita errores de compilación. Si sigue estas reglas y mejores prácticas, podrá crear un Makefile eficiente y fácil de mantener.

Declaración de liberación Este artículo se reproduce en: https://dev.to/ashcript/comprendre-le-makefile-exemple-avec-le-langage-c-47n9 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3