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.

Makefile para generar un archivo binario para cada archivo fuente.

Tengo la siguiente estructura en mi proyecto.

  • /
    • src/
    • bin/
    • Makefile

En el directorio src habrá varios archivos src (cada uno tiene una función principal). Necesito escribir un archivo makefile de tal manera que cuando ejecute
make program1
Busque program1.c en la carpeta src y compile el ejecutable como program1* en la carpeta bin.

Me encontré con esta pregunta en https://stackoverflow.com/questions/9178285/how-can-makefile-use-separate-directories-for-source-code-and-binaries
Pero parece que necesito ingresar manualmente todos los nombres de los programas en la variable PROG.
¿Solo necesito proporcionar el nombre del binario con make y debería hacer la compilación para ese archivo src respectivo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para automatizar el proceso y evitar la necesidad de ingresar manualmente todos los nombres de los programas en una variable, puedes modificar el archivo Makefile de la siguiente manera:

    CC=gcc
    SRC_DIR=src
    BIN_DIR=bin
    
    # encuentra todos los archivos .c en SRC_DIR y crea los archivos de salida correspondientes en BIN_DIR
    $(BIN_DIR)/%: $(SRC_DIR)/%.c
        $(CC) $< -o $@
    
    # define el objetivo program1, que llamará al archivo de salida correspondiente en BIN_DIR
    program1: $(BIN_DIR)/program1*
    

    En este archivo Makefile, el % es un comodín que coincide con cualquier nombre de archivo, y $< y $@ son variables automáticas predefinidas que representan la primera dependencia y el objetivo, respectivamente.

    Ahora, cuando ejecutes make program1, buscará program1.c en el directorio src, lo compilará y generará un ejecutable llamado program1 en el directorio bin. Si tienes programas adicionales, puedes simplemente repetir el mismo formato para cada objetivo, sin necesidad de actualizar ninguna variable manualmente.

Comments are closed.