El Makefile construye el hello
ejecutable si uno cualquiera de main.cpp
, hello.cpp
, factorial.cpp
cambió. El Makefile más pequeño posible para lograr esa especificación podría haber sido:
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- pro: muy fácil de leer
- con: pesadilla de mantenimiento, duplicación de las dependencias de C ++
- con: problema de eficiencia, recompilamos todo C ++ incluso si solo se cambió uno
Para mejorar lo anterior, solo compilamos los archivos C ++ que fueron editados. Luego, simplemente vinculamos los archivos de objetos resultantes.
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
- pro: soluciona el problema de eficiencia
- con: nueva pesadilla de mantenimiento, posible error tipográfico en reglas de archivos de objetos
Para mejorar esto, podemos reemplazar todas las reglas de archivos de objetos con una sola .cpp.o
regla:
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
- pro: volver a tener un archivo MAKE corto, algo fácil de leer
Aquí la .cpp.o
regla define cómo construir anyfile.o
desde anyfile.cpp
.
$<
coincide con la primera dependencia, en este caso, anyfile.cpp
$@
coincide con el objetivo, en este caso anyfile.o
,.
Los otros cambios presentes en el Makefile son:
- Facilitando el cambio de compiladores de g ++ a cualquier compilador de C ++.
- Haciendo más fácil cambiar las opciones del compilador.
- Haciendo más fácil cambiar las opciones del enlazador.
- Facilitando el cambio de los archivos de origen y la salida de C ++.
- Se agregó una regla predeterminada 'todos' que actúa como una verificación rápida para garantizar que todos sus archivos de origen estén presentes antes de que se intente construir su aplicación.