Cómo escribir un Makefile para compilar un programa C simple

7 minutos de lectura

Avatar de usuario de Zhivago
Zhivago

Compile el siguiente programa

#include <stdio.h>
int main(void)
{
   printf ("Hello from your first program!\n");
   return 0;
}

a)-mediante el uso de un archivo de tipo Makefile

b)-el ejecutable se llamará Hello

“Por favor, ayuda para hacer un ejercicio. Sé cómo hacerlo en CodeBlocks, pero no sé qué es Makefile y cómo escribirlo en Linux. Lo compilé usando el comando “gcc filename.c” y luego “./ a.out” pero todavía no entiendo qué es el Makefile. ¿Es una especie de script de shell, una instrucción? ¿Cómo se vería exactamente un Makefile para esta tarea? Gracias de antemano 🙂 “

  • ¿Has probado a buscar en Google Tutorial de archivo MAKE?

    – RojoX

    4 de febrero de 2014 a las 9:31

  • Has probado Tutorial de CMake?

    – yegorich

    4 de febrero de 2014 a las 10:27

  • Por alguna razón, los programadores de bajo nivel SÍ participan en StackOverflow, pero piensan que no es el lugar adecuado para proporcionar buenas respuestas y enseñar a los que no saben, solo para ser cínicos y proporcionar enlaces o sugerir leer las páginas man ¯_(ツ)_/¯

    –Rafael Eyng

    19 de octubre de 2017 a las 0:49

Avatar de usuario de Jayesh Bhoi
Jayesh Bhoi

Este es su archivo de creación simple para el programa hola.

CC      = gcc
CFLAGS  = -g
RM      = rm -f


default: all

all: Hello

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

clean veryclean:
    $(RM) Hello

Supongamos que tienes dos makefiles en un directorio llamado makefile.m1 y makefile.m2 y si desea compilar ambos archivos, use los siguientes comandos

make -f makefile.m1
make -f makefile.m2

o usar solo Makefile eso contiene:

m1:
  make -f makefile.m1

m2:
  make -f makefile.m2

y use make m1 o make m2

Ahora aclaremos su duda sobre el nombre del archivo make no debe requerir Makefile

Puedes nombrar el makefile como quieras. supongo que me gustaría dar nombre myfirstmakefile.mk. Para usarlo más tarde, debe indicar qué makefile desea. Use la opción -f para esto:

make -f myfirstmakefile.mk

Y de nuevo extensión .mk tampoco es obligatorio, puedes usar lo que quieras, pero nunca te olvidaste de usar -f opción.

así que puede que esta ayuda tenga sentido para usted.

  • Muchas gracias. ? ¿Con qué comando de Unix Shell comenzaste? ¿Ingresó primero en nano Hello.c (escribió el programa Hello world y escribió nano Hello.makefile, o cuáles fueron sus pasos desde el principio?

    – Zhivago

    4 de febrero de 2014 a las 11:05

  • Escribí eso en un archivo llamado mkmk usando nano y cuando escribí make mkmk dice 1make: no hay nada que hacer por defecto, pero por qué

    – Zhivago

    4 de febrero de 2014 a las 11:08

  • No, en Linux simplemente copie el código anterior en un nuevo archivo llamado Makefile y también hacer Hello.c programa en el mismo directorio donde arriba Makefile pusiste. Ahora, desde la terminal, ve a ese directorio y simplemente escribe make para construir Hello.c y make clean para limpiar la salida.

    – Jayesh Bhoi

    4 de febrero de 2014 a las 11:10


  • He observado que si nombra un archivo MAKE que no sea “Makefile”, no funciona, ¿qué sucede si necesita crear dos archivos MAKE?

    – Zhivago

    6 de febrero de 2014 a las 21:07


  • No… no es obligatorio dar un nombre de archivo make como Makefile puede dar lo que quiera … déjeme explicarle las reglas de makefile con más detalles … vea mi respuesta actualizada.

    – Jayesh Bhoi

    7 de febrero de 2014 a las 4:20

Avatar de usuario de Jens
Jens

A archivo MAKE es una receta para el make utilidad cómo crear un archivo (llamado objetivo) de algunos otros archivos (llamados dependencias) usando un conjunto de comandos ejecutados por el shell. Un archivo MAKE normalmente se ve así:

target: dependency [...]
        command1
        command2

intenta correr man make para detalles.

Ahora para su tarea, realmente no hay necesidad de un Makefile, ya que make tiene reglas integradas que saben cómo compilar un programa simple. Todo lo que necesita hacer es colocar su fuente C en un archivo con el nombre del ejecutable (Hello) y con un .c extensión, es decir Hello.c.

Entonces un sencillo

$ make Hello
cc     Hello.c   -o Hello

hace todo Si desea utilizar gcc en lugar de cc, puede ejecutar

$ rm Hello
$ make CC=gcc Hello
gcc     Hello.c   -o Hello

Si le dice a su instructor/maestro/profesor que todo lo que necesita es un archivo MAKE vacío, ya que sabe que las reglas integradas hacen lo correcto, obtendrá algo de crédito adicional y tal vez su instructor haya aprendido algo nuevo 🙂 Si se le pide una referencia, puede citar las partes relevantes del manual de fabricación o, hágalo como un profesional, citar del Estándar POSIX para la utilidad makesección Reglas predeterminadas.

  • Muchas gracias. Sólo para asegurarme de que lo hice bien. Primero creé un Hello.c usando nano y mi código fuente, luego lo guardé y salí, y escribí (make Hello) en la consola de terminal (de Linux/Unix) y obtuve (cc Hello.c -o Hello) bajo mi comando. Así que supongo que cc(es para compilar c) y (-o es algo si la vinculación pone la salida ejecutable en la salida del archivo, pero ¿qué significa realmente en palabras ordinarias? (compila Hello.c y da una salida vacía de la ¿Instrucciones de Makefile por defecto?) Pero luego ejecuto el mismo comando (make Hello) y dio (make: Hola’ está actualizado.`)

    – Zhivago

    04/02/2014 a las 11:00


  • make compila tu Hello.c archivo y cree binario según su nombre de archivo. Si vuelve a dar make entonces buscará cambios en su Hello.c si no se encuentra el archivo, simplemente envíelo Hello is upto date

    – Jayesh Bhoi

    4 de febrero de 2014 a las 11:22


  • @Zhivago Cuando ejecuta make por segunda vez, verifica si la dependencia es más joven que el objetivo. Si es así, ejecuta los comandos. Si no, no hay nada que hacer y make dice ‘Hola está actualizado’. Es lo suficientemente inteligente como para saber que si Hello.c no cambió, no hay necesidad de compilarlo. Ese es el objetivo de make: hacer el trabajo mínimo necesario para actualizar un objetivo. Si usted touch Hello.c o rm Hello volverá a compilar.

    – Jens

    4 de febrero de 2014 a las 11:59


  • @Zhivago El -o file opción al compilador nombra el archivo de resultados (que por defecto es a.out. Sí, cc es el nombre tradicional del compilador de Unix C, que en Linux es idéntico a gcc.

    – Jens

    4 de febrero de 2014 a las 12:03

  • @Jens ¿Podría decirme qué hizo cuando escribió $ make CC=gcc Hola, estableció un argumento o una variable?

    – Zhivago

    19/09/2014 a las 14:34

antes de optar por makefile, debe saber qué es y por qué lo necesitamos

¿Qué es Makefile?

Makefile es un script escrito en una cierta sintaxis prescrita que ayuda a construir la salida de destino (normalmente, uno o más ejecutables) a partir de archivos de origen mediante la compilación y la vinculación. En palabras simples, makefile compilará su código fuente de manera simple y rápida. ¿Por qué necesitamos Makefile?

=> Los proyectos grandes pueden contener varios archivos fuente que dependen entre sí o están organizados de manera jerárquica, por ejemplo, para compilar el archivo A, primero debe compilar B; para compilar B, primero debe compilar C; y así.

=> Make es una solución a estos problemas. Se puede usar para compilar todo el proyecto de una manera bien organizada y generar su objetivo de acuerdo con su regla de creación (que discutiremos más adelante) ingresando el comando único que es hacer.

=> Una característica importante es que cuando un proyecto se vuelve a compilar después de algunos cambios, volverá a compilar solo los archivos que se cambiaron y cualquier otro archivo que dependa de él. Esto ahorra mucho tiempo.

=> Para un proyecto grande, cuando se realizan algunos cambios en la fuente, volver a compilar manualmente todo el proyecto cada vez es tedioso, propenso a errores y requiere mucho tiempo.

Aquí hay un buen enlace para ello:Cómo escribir el primer archivo MAKE

Un archivo MAKE es una receta para computadoras con instrucciones sobre cómo realizar ciertas tareas y con dependencias entre esas tareas.

En la forma simple, se ve así:

a.out: filename.c
        gcc filename.c

Leer: “Para construir a.out de filename.cejecute el comando gcc filename.c. Si a.out es más nuevo que filename.centonces no hagas nada”

Nota: El primer carácter en el gcc línea debe ser una ficha.

¿Ha sido útil esta solución?