El Makefile construye el ejecutable hello
si cualquiera de main.cpp
, hello.cpp
, factorial.cpp
cambiado.El Makefile más pequeña 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 para el mantenimiento, la duplicación de las dependencias del C++
- con: problema de eficiencia, recompilamos todo C++ aunque haya cambiado uno solo
Para mejorar lo anterior, solo compilamos los archivos C++ que se editaron. Luego, solo 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: correcciones de emisión de la eficiencia
- con: nueva pesadilla de mantenimiento, el potencial de error tipográfico en las reglas archivos de objetos
Para mejorar esto, podemos reemplazar todas las reglas de archivos objeto con una sola .cpp.o
regla:
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o [email protected]
- Pro: volver a tener un corto makefile, algo fácil de leer
Aquí la regla .cpp.o
define cómo construir anyfile.o
de anyfile.cpp
.
$<
partidos a primera dependencia, en este caso, anyfile.cpp
[email protected]
coincide con el objetivo, en este caso, anyfile.o
.
Los otros cambios presentes en el Makefile son:
- Por lo que es más fácil de cambios compiladores de g ++ a cualquier compilador C++.
- Haciendo que sea más fácil cambiar las opciones del compilador.
- Haciendo que sea más fácil cambiar las opciones del enlazador.
- Haciendo que sea más fácil cambiar los archivos fuente C++ y la salida.
- Se agregó una regla predeterminada 'todo' que actúa como una comprobación rápida para garantizar que todos sus archivos fuente estén presentes antes de que se intente crear su aplicación.
El enlace de arriba se ha roto, aquí está la otra: http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html – asciz
Hola lo que hace este" .cpp.o : "como un objetivo? (¿la última línea?). –
El ".cpp.o:" significa construir ".o" (archivos de objetos) desde ".cpp" (archivos fuente) – jaguzu