c++ build-process makefile

c++ - ¿Puedo compilar todos los archivos.cpp en src/to.o en obj/, y luego vincular a binario en./?



build-process makefile (2)

Wildcard funciona también para mí, pero me gustaría dar una nota al margen para aquellos que usan variables de directorio. Siempre use barras para el árbol de carpetas (no barra invertida); de lo contrario, fallará:

BASEDIR = ../.. SRCDIR = $(BASEDIR)/src INSTALLDIR = $(BASEDIR)/lib MODULES = $(wildcard $(SRCDIR)/*.cpp) OBJS = $(wildcard *.o)

Mi directorio de 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 mi makefile hiciera sería compilar todos los archivos .cpp en la carpeta /src a los archivos .o en la carpeta /obj , luego vincular todos los archivos .o en /obj al binario de salida en el nivel superior carpeta /project .

No tengo casi experiencia con Makefiles, y no estoy seguro de qué buscar para lograr esto.

Además, ¿es esta una "buena" manera de hacer esto, o hay un enfoque más estándar de lo que estoy tratando de hacer?


Makefile es parte de la pregunta

Esto es bastante fácil, a menos que no necesite generalizar intente algo como el siguiente código (pero reemplace la sangría de espacio con pestañas cerca de g ++)

SRC_DIR := .../src OBJ_DIR := .../obj SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp) OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) LDFLAGS := ... CPPFLAGS := ... CXXFLAGS := ... main.exe: $(OBJ_FILES) g++ $(LDFLAGS) -o $@ $^ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

Generación automática de gráficos de dependencia

Una función "imprescindible" para la mayoría de los sistemas make. Con GCC in se puede hacer en una sola pasada como efecto secundario de la compilación agregando el indicador CXXFLAGS a CXXFLAGS y -include $(OBJ_FILES:.o=.d) al final del cuerpo del archivo MAKE:

CXXFLAGS += -MMD -include $(OBJ_FILES:.o=.d)

Y como ya mencionaron los muchachos, siempre tienen gnu.org/software/make/manual/make.html , es muy útil.