Каталог моего проекта выглядит так:
/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
.
У меня почти нет опыта работы с Makefiles, и я не совсем уверен, что искать для этого.
Кроме того, это «хороший» способ сделать это или есть более стандартный подход к тому, что я пытаюсь сделать?
c++
build-process
makefile
Остин Хайд
источник
источник
Ответы:
Makefile - часть вопроса
Это довольно просто, если вам не нужно обобщать, попробуйте что-то вроде приведенного ниже кода (но замените отступы табуляцией рядом с g ++)
Автоматическая генерация графа зависимостей
Обязательная функция для большинства систем make. С GCC это можно сделать за один проход в качестве побочного эффекта компиляции, добавив
-MMD
флаг вCXXFLAGS
и-include $(OBJ_FILES:.o=.d)
в конец тела make-файла:И, как уже упоминалось, всегда имейте под рукой GNU Make Manual , это очень полезно.
источник
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
должно быть$^
для правила main.exe, и я думаю, что есть опечатка сobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
Подстановочный знак работает и у меня, но я хотел бы сделать небольшое замечание для тех, кто использует переменные каталога. Всегда используйте косую черту для дерева папок (не обратную косую черту), иначе это не удастся:
источник