CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
¿Qué hacen los $@
y $<
hacen exactamente?
Respuestas:
$@
es el nombre del archivo que se genera y$<
el primer requisito previo (generalmente el archivo fuente). Puede encontrar una lista de todas estas variables especiales en el manual de GNU Make .Por ejemplo, considere la siguiente declaración:
En este caso:
$@
evalúa aall
$<
evalúa alibrary.cpp
$^
evalúa alibrary.cpp main.cpp
fuente
$@
no necesariamente tiene que terminar siendo un archivo, también podría ser el nombre de un.PHONY
objetivo.$@s
para generar resultados de ensamblaje como name.os?Los
$@
y$<
se llaman variables automáticas . La variable$@
representa el nombre del archivo creado (es decir, el destino) y$<
representa el primer requisito previo requerido para crear el archivo de salida.Por ejemplo:
Aquí
hello.o
está el archivo de salida. Esto es a lo que se$@
expande. La primera dependencia eshello.c
. Eso es lo que$<
expande.La
-c
bandera genera el.o
archivo; verman gcc
para una explicación más detallada. los-o
especifica el archivo de salida a crear.Para más detalles, puede leer este artículo sobre Linux Makefiles .
Además, puede consultar los manuales de GNU
make
. Será más fácil crear Makefiles y depurarlos.Si ejecuta este comando, generará la base de datos makefile:
fuente
$<
se expandirá ahello.c hello.h
(ambos). Por favor aclarar.$<
Es solo el primer artículo. Para incluir todo, use$^
.De Gestión de proyectos con GNU Make, 3a edición, p. 16 (está bajo licencia de documentación libre de GNU ):
fuente
Las
$@
y$<
son macros especiales.Dónde:
$@
es el nombre del archivo de destino.$<
es el nombre de la primera dependencia.fuente
El Makefile construye el
hello
ejecutable si uno cualquiera demain.cpp
,hello.cpp
,factorial.cpp
cambió. El Makefile más pequeño posible para lograr esa especificación podría haber sido:Para mejorar lo anterior, solo compilamos los archivos C ++ que fueron editados. Luego, simplemente vinculamos los archivos de objetos resultantes.
Para mejorar esto, podemos reemplazar todas las reglas de archivos de objetos con una sola
.cpp.o
regla:Aquí la
.cpp.o
regla define cómo construiranyfile.o
desdeanyfile.cpp
.$<
coincide con la primera dependencia, en este caso,anyfile.cpp
$@
coincide con el objetivo, en este casoanyfile.o
,.Los otros cambios presentes en el Makefile son:
fuente
a modo de ejemplo si desea compilar fuentes pero tiene objetos en un directorio diferente:
Necesitas hacer :
pero con la mayoría de las macros, el resultado será todos los objetos seguidos de todas las fuentes, como:
así que esto no compilará nada ^^ y no podrá colocar sus archivos de objetos en un directorio diferente :(
la solución es usar estas macros especiales
esto generará un archivo .o (obj / file.o) para cada archivo .c en SRC (src / file.c)
significa :
pero líneas por líneas EN LUGAR de todas las líneas de OBJ seguido de todas las líneas de SRC
fuente