Мой каталог проекта похож на это:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
То, что я хотел бы, чтобы мой make-файл сделал, должно будет скомпилировать все .cpp
файлы в /src
папка к .o
файлы в /obj
папка, затем свяжитесь весь .o
файлы в /obj
в выходной двоичный файл в папке верхнего уровня /project
.
Я не имею рядом ни с каким опытом с Make-файлами, и не действительно уверено, что искать для выполнения этого.
Кроме того, действительно ли это - "хороший" способ сделать это или является там более стандартным подходом к тому, что я пытаюсь сделать?
Makefile часть вопроса
Это довольно просто, если вам не нужно обобщать попробуйте что-то вроде приведенного ниже кода (но замените пробельные отступы на табуляции в 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 $@ $<
Автоматическая генерация графа зависимостей
Обязательная функция для большинства систем make. В GCC это можно сделать за один проход как побочный эффект компиляции, добавив флаг -MMD
к CXXFLAGS
и -include $(OBJ_FILES:.o=.d)
в конец тела makefile:
CXXFLAGS += -MMD
-include $(OBJ_FILES:.o=.d)
И, как ребята уже говорили, всегда имейте при себе GNU Make Manual, это очень полезно.