El directorio de mi proyecto se ve así:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
Lo que me gustaría que hiciera mi archivo MAKE sería compilar todos los .cpp
archivos de la /src
carpeta en .o
archivos de la /obj
carpeta, luego vincular todos los .o
archivos /obj
al binario de salida en la carpeta de nivel superior /project
.
Casi no tengo experiencia con Makefiles y no estoy realmente seguro de qué buscar para lograrlo.
Además, ¿es esta una "buena" forma de hacer esto, o hay un enfoque más estándar para lo que estoy tratando de hacer?
c++
build-process
makefile
Austin Hyde
fuente
fuente
Respuestas:
Makefile parte de la pregunta
Esto es bastante fácil, a menos que no necesite generalizar, pruebe algo como el siguiente código (pero reemplace la sangría del espacio con pestañas cerca de g ++)
Generación automática de gráficos de dependencia
Una característica "imprescindible" para la mayoría de los sistemas de marcas. Con GCC en que se puede hacer en un solo paso como un efecto secundario de la compilación mediante la adición de
-MMD
bandera aCXXFLAGS
y-include $(OBJ_FILES:.o=.d)
al extremo del cuerpo makefile:Y como los chicos ya han mencionado, siempre tenga a mano GNU Make Manual , es muy útil.
fuente
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
debería ser$^
para la regla main.exe y creo que hay un error tipográfico conobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
El comodín también funciona para mí, pero me gustaría dar una nota al margen para aquellos que usan variables de directorio. Utilice siempre la barra diagonal para el árbol de carpetas (no la barra invertida), de lo contrario fallará:
fuente