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.