Могу ли я скомпилировать все .cpp-файлы в src / to .o в obj /, затем ссылку на двоичный файл ./?

Каталог моего проекта выглядит следующим образом:

/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 .

У меня нет опыта работы с Makefile, и я не уверен, что искать для этого.

Кроме того, это «хороший» способ сделать это, или есть более стандартный подход к тому, что я пытаюсь сделать?

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 [email protected] $^ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp g++ $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 

Генерация графа автоматической зависимости

Функция «must» для большинства систем make. С помощью GCC in можно сделать за один проход в качестве побочного эффекта компиляции, добавив флаг CXXFLAGS в CXXFLAGS и -include $(OBJ_FILES:.o=.d) в конец тела файла makefile:

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

И, как уже упоминалось, всегда есть GNU Make Manual , это очень полезно.

Подстановочный шаблон работает и для меня, но я хотел бы дать дополнительную заметку для тех, кто использует переменные каталога. Всегда используйте косую черту для дерева папок (не обратную косую черту), иначе она не будет работать:

 BASEDIR = ../.. SRCDIR = $(BASEDIR)/src INSTALLDIR = $(BASEDIR)/lib MODULES = $(wildcard $(SRCDIR)/*.cpp) OBJS = $(wildcard *.o) 
  • Как определить несколько include path в Makefile
  • Как написать цикл в Makefile?
  • Подстановочные цели в Makefile
  • В чем разница между назначениями переменных GNU Makefile =,? =,: = И + =?
  • Как написать команду 'cd' в make-файле?
  • Источники из подкаталогов в Makefile
  • Общее правило из makefile в CMake
  • Использование G ++ для компиляции нескольких файлов .cpp и .h
  • Какова цель .PHONY в make-файле?
  • Передача аргументов для «make run»
  • Почему PONI неявные правила шаблонов не срабатывают?
  • Давайте будем гением компьютера.