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.cppfuente
$@no necesariamente tiene que terminar siendo un archivo, también podría ser el nombre de un.PHONYobjetivo.$@spara 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.oestá el archivo de salida. Esto es a lo que se$@expande. La primera dependencia eshello.c. Eso es lo que$<expande.La
-cbandera genera el.oarchivo; verman gccpara una explicación más detallada. los-oespecifica 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
helloejecutable si uno cualquiera demain.cpp,hello.cpp,factorial.cppcambió. 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.oregla:Aquí la
.cpp.oregla define cómo construiranyfile.odesdeanyfile.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